2012-09-09 137 views
1

我對某事感到困惑。內存分配和NULL指針

第一:

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

這種類型在運行時獲得動態(堆)存儲,而不是編譯時間像陣列。

malloc()如果沒有內存,可能會返回NULL

而且NULL是在標準C庫中的#define#define NULL ((void *)0)

所以,如果mallocNULL和處執行運行時,編譯器將如何替代NULLvoid *0,我知道,任何文本替換髮生在預編譯階段

+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)。

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,也無所謂什麼NULLmalloc定義,爲NULL總是必須0

在較舊的庫,並且仍然並不少見,NULL用於被定義爲純0,並且在C++平原0是常用的代替NULL

0

回憶事實void*可以「攜帶」的任何類型指針。

實例:

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

h = p; 
h = pp; 

所以如果malloc的失敗,它將返回NULL,這是在C中定義爲(無效*)0,如其他的答案指出。