日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

malloc()参数为0的情况

發布時間:2025/5/22 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 malloc()参数为0的情况 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題來自于《程序員面試寶典(第三版)》第12.2節問題9(這里不評價《程序員面試寶典》,就題論題):

下面的代碼片段輸出是什么?為什么?

char *ptr; if((ptr = (char *)malloc(0))==NULL)puts("Got a null pointer"); elseputs("Got a valid pointer");

?解析:......故意把0值傳給了函數malloc,得到了一個合法的指針,這就是上面的代碼,該代碼的輸出是"Got a valid pointer"。

?

  這個“解析”根本就沒有解析嘛。好在查資料很方便,《C語言參考手冊》上說“如果請求的長度為0,則標準C語言函數返回一個null指針或不能用于訪問對象的非null指針。”或者你也可以直接在linux里man malloc來查閱手冊:

void *malloc(size_t size);

...

malloc() allocates size bytes and returns a pointer to the allocated memory. The memory is not?cleared. If size is 0, then malloc() returns either NULL, or a unique pointer value that can?later be successfully passed to free().

  可見,原題的if是為了鑒別malloc()返回值是NULL,還是一個唯一的待釋放指針;而不是“解析”中的必然是非NULL的“合法指針”,因此輸出也不是確定的,盡管我用gcc和clang多次編譯運行,輸出都是"Got a valid pointer"。

  順便再說說后面的代碼,同樣出自《程序員面試寶典》:

將程序改成:

char *ptr; if(int pp = (strlen(ptr=(char *)malloc(0))) == 0)puts("Got a null pointer"); elseputs("Got a valid pointer");

或者

char *ptr; if(int pp = (sizeof(ptr=(char *)malloc(0))) == 4)puts("Got a null pointer"); elseputs("Got a valid pointer");

如果求ptr的strlen的值和sizeof的值,該代碼的輸出是"Got a null pointer"。

  第一段程序的分析和上面一樣,如果不幸返回了一個唯一的待釋放非NULL指針,行為不可預測;只不過這個if判斷寫的有些繁瑣:注意到“==”優先級高于"=",而賦值語句的值是其左值。

  此時malloc(0)返回了一個可用于free()釋放的唯一指針(非NULL),而且將它傳給strlen(),返回值為0,這樣看來,它用'\0'進行填充的(即內容是NULL而非指針指向NULL)。但這一點并沒有在man中提到,個人猜測是和實現有關的。
  除此以外,順便考察了strlen((char*)NULL)的行為:會導致段錯誤。

  第二段程序呢,sizeof()里寫了一大堆,其實只是計算了sizeof(char *),在32位機上結果當然是4,而sizeof()里面的malloc()根本沒有執行。和前面兩段代碼不同,關鍵點不在malloc而是sizeof。

  對于Dic4000提到的問題“實際項目中什么情況下會給malloc傳0?既然是開辟內存,傳0不是沒有意義嗎?”的個人理解:

1.一般確實不會直接寫malloc(0),但是可能在程序某個地方寫int n;int *p = malloc(n);在別的地方又令n=0,造成了參數為0的情況。若是無心而為,可能導致某種bug。如果了解malloc(0)的行為,找bug相對而言會簡單點。

2.面試題各種稀奇古怪的問題都有可能出現,有的面試官認為考這些邊界條件、特殊參數什么的能考察一個程序員的功底。

?

其他參考文章:

  @凈壇使者進行的更深一步的挖掘,文章和回復都很有價值:關于malloc(0)的返回值問題--這兩天的總結與實踐篇

  @garbageMan?談面試題:別太把面試題當回事兒

?

更蛋疼的問題:

  如果給malloc()傳一個負參數會怎么樣?malloc()的參數是size_t類型,一般是無符號數,負值會被轉化它對應于size_t中的對應值。經我測試,當這個值大于malloc()所能分配的上限時,返回NULL。

?

#include <stdio.h> #include <stdlib.h>int main() {size_t t;t = (size_t)-1;printf("%u\n",t);char * p = malloc(t);if(p==NULL)printf("NULL\n"); }

?

  (剛剛在stackoverflow上看到的http://stackoverflow.com/questions/17925771/what-happens-when-we-call-malloc-with-negative-paramter)





本文轉自五岳博客園博客,原文鏈接:www.cnblogs.com/wuyuegb2312/p/3219659.html,如需轉載請自行聯系原作者

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的malloc()参数为0的情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。