用VC寫個小程式作個實驗。
程式執行的結果是,
'not null'
為什麼配置一塊大小為0的記憶體的回傳值不是NULL?
If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
所以,簡單的講,malloc(0)是沒有定義的行為。對於沒有定義的行為,去討論它是沒意義的...
int *a = (int*)malloc(0);
if (a)
cout << "not null\n";
else
cout << "null\n";
程式執行的結果是,
'not null'
為什麼配置一塊大小為0的記憶體的回傳值不是NULL?
- 有時候要配置的記憶體大小是計算得到的,這個大小有可能為0,為了和配置失敗回傳的NULL作區分,同時也能保持程式對任何大小記憶體的處理一致,所以就讓0大小的配置也回傳個有效的指標。
- 不管是不是NULL,free都能接受。
- ...
If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
所以,簡單的講,malloc(0)是沒有定義的行為。對於沒有定義的行為,去討論它是沒意義的...
malloc回傳一個記憶體位址. 雖然malloc(0)配置了0個有效空間, 回傳一個'not null'應該是挺合理的吧.
回覆刪除是的,但是否合理就要看編譯器怎麼自己去定義(implementation-defined),因為malloc(0)在標準裡並未定義,因此也不具有可攜性
回覆刪除說的也是, 就像這篇提到, 留給編譯器決定的"計算順序"
回覆刪除http://novus.pixnet.net/blog/post/26745180
這是 C Lib 決定而非 Compiler 決定的.
回覆刪除是的,這是clib的實作決定的.謝謝指正!
回覆刪除