문제

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* 이것은 우리가 인덱스하는 방법을 지정하지 않은 메모리에 배치하는 포인터임을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top