2017-02-17 27 views
4

是否定義了行爲實現?如果NULL和大小== 0傳遞給realloc()如果將NULL和大小0傳遞給realloc()會怎麼樣?

int main(void) 
{ 
    int *ptr = NULL; 

    ptr = realloc(ptr, 0); 

    if(ptr == NULL) 
    { 
     printf("realloc fails.\n"); 
     goto Exit; 
    } 

    printf("Happy Scenario.\n"); 

Exit: 
    printf("Inside goto.\n"); 

return 0; 
} 

上面的代碼應打印 「realloc的失敗」,對不對?但它不是?我在某處讀過這個realloc的調用也可能返回NULL。這是什麼時候發生的?

+0

[NULL值(或未定義的指針)上的Realloc可能的重複](http://stackoverflow.com/questions/12134315/realloc-on-null-valued-or-undefined-指針) –

+1

可能的重複做法'不處理'void * vp = realloc(NULL,0);'的行爲的特定點。 –

+0

我同意@Jonathan在這裏。它看起來像引用DUP缺少realloc'ing爲0元素的行爲,以及有關指針,你會回來的信息進行了討論。分配0個元素時,較老的Microsoft平臺有一些麻煩。 – jww

回答

7

此行爲是實現定義的。

C standard

第7.22.3.5(realloc):

如果ptr是一個空指針,該realloc函數的行爲類似於malloc函數爲指定的大小。否則,如果ptr 不匹配的指針早些時候內存管理 函數返回,或者如果空間已釋放通過調用 的freerealloc功能,該行爲是不確定的。如果 不能分配新對象的內存,則舊對象 不會被釋放並且其值不變。

所以realloc(NULL, 0)相同malloc(0)

如果我們再來看一下部分7.22.3。4(malloc):

malloc功能的對象,其大小由size指定,並且其值是不確定的分配空間。

malloc函數返回空指針或指向已分配空間的指針。

標準沒有說明什麼時候0在傳遞發生

但是,如果你看一下Linux的man page

malloc()函數分配size個字節,並返回一個指針 分配的內存。內存未初始化。 如果大小爲0,則 ,然後malloc()返回NULL,或返回一個唯一指針值,後者可以成功傳遞給free()

它明確指出返回的值可以被釋放,但不一定是NULL。

相反,MSDN表示:

如果大小爲0,malloc的堆中分配一個零長度信息並 返回一個有效的指針到該項目。經常檢查從 malloc的回報,即使內存請求的量是很小的。

所以對於MSVC,你不會得到一個空指針。

+0

謝謝!這很有幫助,特別是與MSDN的對比。 – user7375520

11

realloc的(3)DOC:

若ptr爲NULL,則該呼叫相當於對malloc(大小),對於大小的所有值

的malloc(3)DOC:

如果大小爲0,則malloc()返回NULL或唯一的指針值,以後可以成功完全傳遞給free()。

所以是的,它是實現定義的,你會得到null或者你可以釋放一個指針。

+2

如果你得到一個非空指針,你應該釋放指針來避免泄漏,但不能被解除引用(因爲它提供了0字節的合法可訪問內存)。 –

+0

@JonathanLeffler「...你的指針應該被釋放,以避免泄漏」適用於0或非零大小不返回'NULL'分配的所有指針。最終他們應該是免費的,以避免泄漏。 OTOH,如果'的malloc(0)'返回非'NULL',釋放它馬上可以減少內存的使用,也許是個好主意,但它不是一個_leak_問題。 – chux

6

呼叫

realloc(NULL, size); 

相當於

malloc(size); 

什麼malloc()當記者問到分配0字節是有點不清楚呢,標準不說。我認爲它是實現定義的。它基本上「無所謂」;要麼返回NULL,要麼返回一個可以合法訪問零字節的指針,這些非常相似。兩者都可以傳遞給free()

相關問題