|
申請空間時malloc(0)會發(fā)生什么?
有讀者提到以前面試的時候被問到過這個題,正好我剛畢業(yè)的時候也被問過,當時內(nèi)心還一陣腹誹,這道面試題又是會被噴沒有意義的題,個人也感覺研究這種沒什么意義,不過知道下還是沒有壞處的。
#include #include
int main(){ char* p = (char*)malloc(0); printf("Pointer address: %p
", (void*)p);
return 0;}按照第一反應,這種時候應該返回空指針NUL,畢竟你沒有申請到空間地址,動手實踐在Windows上和Linux上分別運行,發(fā)現(xiàn)都打印出了地址
//WindowsPointer address: 000001ABC6A161B0
//linuxPointer address: 0xe5e260實際動手可以發(fā)現(xiàn),mallc(0)返回的指針不是空指針。
其實這種涉及到標準庫的問題,直接看標準就行,cppreference上對malloc為0的情況有明確的說明:
mallocC Dynamic memory management Defined in header void *malloc( size_t size );
If size is zero, the behavior of malloc is implementation-defined. For example, a null pointer may be returned. Alternatively, a non-null pointer may be returned; but such a pointer should not be dereferenced, and should be passed to free to avoid memory leaks.
the behavior of malloc is implementation-defined.是什么意思?
意思就是當malloc接收到一個大小為0的請求時,其行為是由實現(xiàn)定義的。也就是說不同的實現(xiàn)可以選擇不同的處理方式。
返回NULL:
許多實現(xiàn)選擇在這種情況下返回NULL,因為分配0字節(jié)的內(nèi)存沒有實際用途。
返回非空指針:
有些實現(xiàn)可能會返回一個非空指針。這個指針不應被解引用(dereference),并且應該傳遞給free函數(shù)以避免內(nèi)存泄漏。
總結:
malloc(0)的返回值由實現(xiàn)編譯器的人定義,可以是NULL,也可以是一個非空指針,深究沒多大意義。
end
一口Linux
關注,回復【1024】海量Linux資料贈送
精彩文章合集
文章推薦
?【專輯】ARM?【專輯】粉絲問答?【專輯】所有原創(chuàng)?【專輯】linux入門?【專輯】計算機網(wǎng)絡?【專輯】Linux驅(qū)動?【干貨】嵌入式驅(qū)動工程師學習路線?【干貨】Linux嵌入式所有知識點-思維導圖
|
|