題目來自https://www.jobui.com/mianshiti/it/qianrushi/5829/
以下是原文
下面的代碼片段的輸出是什麼,爲什麼?
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts(“Got a null pointer”);
else
puts(“Got a valid pointer”);
這是一個有趣的問題。最近在我的一個同事不經意把0值傳給了函數malloc,得到了一個合法的指針之後,我纔想到這個問題。這就是上面的代碼,該代碼的輸出是“Got a valid pointer”。我用這個來開始討論這樣的一問題,看看被面試者是否想到庫例程這樣做是正確。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。
其實malloc(0)返回的不是空指針也不足爲其,在linux下用man命令查看malloc函數
The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().
說明它確實會有可能申請內存成功的。
malloc申請的內存,一般都會比實質申請的要大,它會去堆空間裏面找出一塊>=需要申請的內存大小的空閒內存出來,所以malloc裏面0值的處理應該是和其他的一樣的,就算申請出來,也不會使用它。比如,你申請了一個20字節的空間,malloc返回的是25個字節的空間,你會去使用超出20字節的空間嗎?我覺得,malloc開發時就考慮到大家都不會用malloc去申請一個0大小的空間,因爲這樣沒意義,所以也沒必要去判斷申請的內存大小是否爲0了。返回NULL一般是沒有足夠的空間了,申請空間失敗才返回NULL。