2009-07-02 53 views
39

很簡單的問題,我提出了以下方案:零大小的malloc

#include <stdlib.h> 
int main(int argc, char ** argv) 
{ 
    void * ptr; 
    ptr = malloc(0); 
    free(ptr); 
} 

而且它不會在我的機器上出現段錯誤。它是stdlib malloc和free的可移植行爲,還是我在尋找麻煩?

編輯:似乎不便攜是由malloc返回的值。問題是關於malloc(0)+自由組合,而不是ptr的值。

+1

請記住,如果這個不奏效,還有不得不有很多特殊情況碼。人們總是會根據變量或表達式來分配大量字節,並且每次都必須檢查零是很尷尬的。 – 2009-10-26 13:33:51

+0

相關:http://stackoverflow.com/questions/2022335/whats-the-point-in-malloc0 – jldupont 2010-01-07 18:23:46

+0

我知道:超級晚評論這個封閉的問題。但是`malloc(0)`有一些用法,沒有提到。在那些返回非NULL值的實現中,尤其是在DEBUG構建中,它可能會分配比您要求的更多的值,併爲您提供指向剛剛經過其內部頭的指針。如果在一系列分配之前和之後得到這個值,這可以讓你感覺到實際的內存使用情況。 – 2017-02-24 17:57:13

回答

54

該行爲是實現定義的,您將收到NULL指針或地址。對於接收到的指針調用free然而它不能產生一個問題,因爲:

  • 免費(NULL)就可以了,沒有操作完成
  • 免費(地址)是確定的,如果從malloc的接收地址(或其他人像calloc等)
23

它允許返回NULL,並允許它返回一個不能解引用的非NULL指針 。這兩種方法是由標準(7.20.3)認可:

如果空間的請求的大小是零,則該行爲 實現定義的:要麼是空指針被返回,或者 行爲是作爲如果大小是非零值,則不應使用返回的指針訪問對象。

+1

這不完全是問題。我不關心malloc返回的值,而是關於通過malloc(0)返回的指針調用free。 – shodanex 2009-07-02 09:32:08

+2

這仍然是一個非常好的答案,因爲與Key的答案一起給出了對行爲的完整概述。 – schnaader 2009-10-26 14:21:29

3

很抱歉的麻煩,我應該已經閱讀了手冊頁:

的malloc()分配size個字節,並返回一個指針分配的內存。內存不被清除。如果size爲0,則malloc()返回NULL,或者返回一個可以稍後成功傳遞給free()的唯一指針值。 (),calloc()或realloc()返回的ptr所指向的內存空間必須已經返回。否則,或者如果之前已調用了空閒(ptr),則會發生未定義的行爲。如果ptr爲NULL,則不執行任何操作。

看來這是真的,至少在GNU libc的

1

更新考慮到LIBT &大同的評論:

調用malloc的行爲(0)是依賴於實現或者換句話說,非便攜 且未定義。

鏈接到CFaq問題了解更多詳情。

1

根據C標準

7.20.3 如果空間的請求的大小爲零,則行爲實現定義:返回任一個空指針,或行爲是因爲如果尺寸是一些非零值,但不應使用返回的指針訪問對象。

-2

根據我的經驗,我已經看到的malloc(0)返回一個可以釋放的指針。 但是,這會在以後的malloc()語句中導致SIGSEGV。 這是非常隨機的。

當我增加了一個檢查,對於不調用malloc如果要分配的大小是零,我擺脫了這一點。

所以,我建議不要對大小分配內存0

-Ashutosh