2012-09-09 7 views
1

나는 혼란 스럽다. 첫째메모리 할당과 NULL 포인터

:

int *ptr; 
ptr = malloc(10 * sizeof(int)); 

배열 같은 시간를 컴파일하지 , 런타임에서 동적 (힙) 메모리를 얻기의이 유형.

malloc()은 메모리가없는 경우 NULL이 될 수 있습니다. malloc 반환 NULL가하고 컴파일러가 void *0NULL을 대체하는 방법, 런타임에서 실행하고 내가 알고있는 경우

그리고 NULL#define NULL ((void *)0)

그래서 표준 C 라이브러리에서 #define 어떤 텍스트 대체는 에서 발생합니다 사전 컴파일 단계

+0

엄밀히 말하면,'malloc'은'NULL'을 리턴하지 않습니다. 'void *'형의 널 포인터를 반환한다. 'NULL' 매크로는'void *'타입의 널 포인터 또는 값이 0 인 정수형 상수로 평가되는 표현식으로 확장되도록 정의됩니다. 이것은 구현에 달려 있습니다. 따라서,'malloc'은 실패했을 때'NULL'과 같은 값을 반환하지만'NULL'과 같은 타입 일 필요는 없습니다.'NULL'은 매크로이기 때문에 확실히'NULL'이 아닙니다. "매크로를 반환하는"함수. 함수는 값을 반환합니다. –

답변

5

NULL을 대체 아니, 잘못 생각한거야. 이 같은 malloc 기능 무언가를 상상 :

void *malloc(size_t n) 
{ 
    /* magic */ 
    return NULL; 
} 

컴파일러는 NULL을 대체하는 번역 단위가를 컴파일 할 때 즉, 표준 라이브러리 컴파일 할 때 너무 전처리 단계 과거 NULL 살아남의 흔적. 그 후, malloc은 그게 무슨 가치가 있는지를 단지 숫자로 반환합니다.

+0

고마워, 너는 내가 놓친 바로 그 개념으로 나를 몰아 넣는다. :)) –

1

컴파일 후 모든 NULL은 ((void *) 0)로 바뀌 었습니다. 메모리가없는 경우 malloc은 단지 (void *) 0을 반환합니다. 널 (NULL)와 소스 코드 어딘가에 비교 될 수

1

그것은 반환 (무효 *) 0, 뭔가 같은 :

int *ptr; 
    ptr = malloc(10 * sizeof(int)); 
    if(ptr == NULL) 
     //do something 

컴파일러는 경우 표현하지 ptr

0

표현식 ((void *)0)은 일반 0과 동일하며 유형은 void *으로 유형이 변환되었습니다. 그렇기 때문에 예를 들어 if (!myPointer) 포인터가 NULL이 아닌지 확인하십시오. NULL가 페일 린 0과 동일로 항상0 수있다 NULL, malloc에 정의 된 것을 NULL 중요하지 않습니다. 사용 여전히

오래된 도서관에서

, 그리고 드문 일이 아니다, NULL은 일반 0으로 정의 할, 그리고 C++에서 일반 0 일반적으로 대신 NULL 사용됩니다.

0

리콜 void*모든 유형의 포인터를 "수행"할 수 있다는 사실.

예 : 다른 답변 지적

void *h; 
int *p, **pp; 

h = p; 
h = pp; 

그래서 malloc에 ​​실패하는 경우는, (무효 *)을 0으로 C에 정의되어 NULL을 반환한다.