malloc 0 的執行實驗

2021-10-09 18:18:20 字數 1702 閱讀 2716

碰到這樣的題目,問 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 返回乙個合法的指標並指向儲存記憶體塊資訊的額外記憶體,我們當然可以在該記憶體上進行讀寫操作,但是這樣做了會破壞該記憶體塊的維護資訊,因此當我們呼叫...