碰到這樣的題目,問 malloc(0) 有什麼後果和輸出,這裡來vs上進行執行試驗
我們在堆上申請一塊記憶體,若申請size為0,有很多文章已經進行了描述:參考1,參考2,參考3,參考4
char *ptr,*next;
char *tmp1, *tmp2, *t***;
//申請多個size為0的記憶體
tmp1 = (char*)malloc(0 * sizeof(char));
tmp2 = (char*)malloc(0 * sizeof(char));
t*** = (char*)malloc(0 * sizeof(char));
ptr = (char*)malloc(0 * sizeof(char));
//申請乙個大小為2的記憶體並寫入字串 「s」
next = (char*)malloc(2 * sizeof(char));
next[0] = 's';
next[1] = '\0';
cout << next << endl;
//判斷size為0的記憶體是否有效
if (null == ptr)
printf("got a null pointer\n");
else
執行效果如下:

可見:申請size為0的記憶體可以返回有效位址,並且除第乙個申請的記憶體位址較遠(0x00405ab0),後面申請的均為連續區域,每個相差0x30(48b)。
另外,可以推測在此環境下(windows,vs2017,debugx86),若申請記憶體小於48b,則均為48b。這篇文章解釋了為什麼是48b。
進行乙個記憶體寫入越界試驗,進行如下修改:
//將長度為50,包含49個'a'與1個'\0'的字串,拷貝到ptr所指的記憶體
strcpy_s(ptr, 50, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
執行結果如下:
可見:記憶體寫入越界,對 ptr 指標的寫入,導致了next指標所指內容傳送的變化,並且程式報錯:觸發了乙個斷點
原因是堆已被破壞。
減少寫入個數,當降至長度為47時,寫入沒毛病,不會出錯:
即,寫入48b以下的空間,並不會出錯;等於48b或者大於48b的空間,會破壞堆,這一點參考文章有講。
malloc(0)會得到乙個正確的指標,也並不是返回乙個空指標;對返回的位址寫入值,在一定範圍內也能正常執行,但是範圍大小取決於執行環境。另外,申請的記憶體可能連續也可能不連續,但這就是另外乙個故事了。
關於malloc 0 的問題
該 的輸出是 got a valid pointer 不信的可以嘗試下!只給出答案,但沒給出具體的原理解答。下面我說一下關於這個題目的嘗試情況 正常在指標的引用時候,如果定義char str null 後如果不對其進行malloc的話,執行memcpy str,hello strlen hello ...
關於malloc(0)的對與錯
大家都知道malloc 1 是錯的,但是malloc 0 到底是對還是錯呢?在以前我也沒有考慮過,只知道malloc 0 是沒有申請任何空間的,是沒法往裡面寫入東西的,但是我在linux上和window編譯時卻讓我出乎意料,它既然沒有報錯,可以輸入和輸出,看乙個例子大家就知道了 window上執行結...
關於malloc 0 的對與錯
當malloc分配記憶體時它除了分配我們指定size的記憶體塊,還會分配額外的記憶體來儲存我們的記憶體塊資訊,用於維護該記憶體塊。因此,malloc 0 返回乙個合法的指標並指向儲存記憶體塊資訊的額外記憶體,我們當然可以在該記憶體上進行讀寫操作,但是這樣做了會破壞該記憶體塊的維護資訊,因此當我們呼叫...