C : void를 통해 반환하는 기능 *
-
10-07-2019 - |
문제
Java에서 나오는 것은 다음에서 반환 값을 허용하는 무효를 사용하여 혼란스러워합니다.
void *emalloc(size_t s) {
void *result = malloc(s);
if (NULL == result) {
fprintf(stderr, "MEMORY ALLOCATION FAILURE\n");
exit( EXIT_FAILURE );
}
return result;
}
이것은 기억을 할당 한 척에 대한 포인터를 반환하고 있습니까?
해결책
예, 그것은입니다. void* 포인터는 기본적으로 메모리 주소에 대한 일반적인 포인터이며, 일반적으로 실제로 원하는 유형에 맞게 타입 캐스트 할 수 있습니다.
다른 팁
귀하의 질문은 기능의 리턴 유형을 잘못 읽고 있음을 나타냅니다. 다음 사이에는 큰 차이가 있습니다.
void foo( void ) {}
그리고
void *bar( void ) {}
foo ()는 인수를 취하지 않고 값을 반환하지 않으며 Bar ()는 인수를하지 않고 일반적인 포인터를 반환합니다. C에서 키워드 void는 일반적인 포인터를 나타내는 데 사용되며 유형 void *의 객체는 정보 손실없이 다른 객체 포인터 유형으로 변환 될 수 있습니다.
예,이 기능은 지정된 크기의 할당 된 메모리에 대한 포인터를 반환합니다. Malloc에서는 포인터를 반환하는 것이 보장된다는 의미에서 다릅니다. 실패시 응용 프로그램이 종료됩니다.
예. void*
무언가에 대한 포인터를 의미하지만 특정 유형은 없습니다.
무효는 본질적으로 유형이 없다는 것을 의미하므로 무효가있는 경우 *p; P는 무언가에 대한 포인터이지만 우리는 무엇을 말하지 않았습니다.
포인터가없는 공허는 아무것도 아니기 때문에 void foo (void)는 논증을 취하지 않고 아무것도 반환하지 않는 함수입니다.
그리고 예 Malloc은 일부 메모리 덩어리에 대한 포인터를 반환합니다. Malloc은 메모리가 어떤 유형인지 알지 못하므로 리턴 유형이 무효입니다*
Java에는 포인터 산술이 없습니다. 이것이 당신이 요구하는 것이라고 생각합니다. 예를 들어, 상상해보십시오 malloc
유형의 포인터를 반환합니다 int
int* malloc(size_t size)
{
//
}
당신은 아마도 포인터를받을 것입니다. array
. 그런 다음 일반 어레이처럼 색인됩니다.
int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).
문제는 그 것입니다 C
기능 과부하 기능이 없습니다. 그래서 우리는 일반적인 것을 작성하는 방법을 찾아야합니다. malloc
. 그렇지 않으면, 당신은 다른 것으로 끝납니다 malloc
모든 유형에 대해. 솔루션은 필요한 바이트 수를 보내는 것입니다. 그런 다음 원하는대로 색인화 할 수 있습니다. 이것은 더 큰 유연성과 모든 솔루션에 대한 유연성을 제공합니다.
int* i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte
int thirdElement = i[3]; // third element. 12 bytes away from (*i)
char secondElement = c[2]; // second element. 2 bytes away from (*c)
따라서 전체 아이디어는 우리가 얻은 메모리를 어떻게 색인화하는지는 중요하지 않다는 것입니다. malloc
. 우리가해야 할 일은 새로 생성 된 배열의 유형을 지정하여 올바르게 인덱싱하는 것입니다. void*
이것은 우리가 인덱스하는 방법을 지정하지 않은 메모리에 배치하는 포인터임을 의미합니다.