關於malloc 0 的問題

2021-05-23 08:29:54 字數 1106 閱讀 5424

該**的輸出是「got a valid pointer」,不信的可以嘗試下!只給出答案,但沒給出具體的原理解答。

下面我說一下關於這個題目的嘗試情況:

正常在指標的引用時候,如果定義char *str = null;後如果不對其進行malloc的話,執行memcpy(str,"hello",strlen("hello"))是會出現錯誤的,而且malloc的空間必須要大於等於strlen("hello")。正常的malloc乙個大於0的長度,會在堆區分配一段空間來供程式設計師使用,memcpy等等。理論上來說如果想要賦值乙個字串到目標指標執行的空間,這個指標指向的空間必須有足夠的「大小」來儲存。按照malloc(a)函式的說明,malloc錯誤會返回乙個null指標,如果執行成功會返回乙個大小為a的空間,malloc(0)如果可以成功執行,則應該在堆區分配乙個大小為0的空間,但我嘗試往這個空間賦值,會發現無論你要複製的字串有多長都可以複製進去,和正常的malloc(strlne(str))這樣不同的是這個空間無法通過free來釋放掉,free(str)就會報錯。

基本情況就是這樣,我想知道啊這個空間具體是什麼位置的,為什麼沒有大小限制可以往裡面無限賦值,這裡有沒有人研究過這問題,一起來討論下!、

首先來解釋malloc(0)的問題,這個語法是對的,而且確實也分配了記憶體,但是記憶體空間是0,就是說返回給你的指標是不能用的,感覺奇怪吧?但是從作業系統的原理來解釋就不奇怪了,這要涉及作業系統維護記憶體的方法來說了,在記憶體管理中,記憶體被分為2部分,棧和堆,棧有自己的機器指令,是乙個先進後出的資料結構,我就在這裡不再過多解釋了,malloc分配的記憶體是堆記憶體,由於堆沒有自己的機器指令,所以要有系統自己編寫演算法來管理這片記憶體,通常的做法是用鍊錶,在每片被分配的記憶體前加個表頭,裡面儲存了被分配記憶體的起始位址和大小,你的malloc返回的就是表頭里的起始指標,這個位址是由一系列的演算法得來了,通常不會為0,一旦分配成功,就返回乙個有效的指標,對於分配0空間來說,演算法已經算出可用記憶體的起始位址,但是你占用0空間,所以對那個指標操作就是錯誤的,作業系統一般不知道其終止位址,因為有占用大小就可以推出終止位址,還有就是即使分配0空間也要釋放它,其實是釋放的鍊錶結點

還有,返回的指標是可用位址的起始位址,雖然你可以無限賦值,但是其實是錯誤的,因為可能有其他有用的資料在那一片區域,如果指標越界就會出現意想不到的事情,不懂的再問

關於malloc(0)的對與錯

大家都知道malloc 1 是錯的,但是malloc 0 到底是對還是錯呢?在以前我也沒有考慮過,只知道malloc 0 是沒有申請任何空間的,是沒法往裡面寫入東西的,但是我在linux上和window編譯時卻讓我出乎意料,它既然沒有報錯,可以輸入和輸出,看乙個例子大家就知道了 window上執行結...

關於malloc 0 的對與錯

當malloc分配記憶體時它除了分配我們指定size的記憶體塊,還會分配額外的記憶體來儲存我們的記憶體塊資訊,用於維護該記憶體塊。因此,malloc 0 返回乙個合法的指標並指向儲存記憶體塊資訊的額外記憶體,我們當然可以在該記憶體上進行讀寫操作,但是這樣做了會破壞該記憶體塊的維護資訊,因此當我們呼叫...

malloc 0 的執行實驗

碰到這樣的題目,問 malloc 0 有什麼後果和輸出,這裡來vs上進行執行試驗 我們在堆上申請一塊記憶體,若申請size為0,有很多文章已經進行了描述 參考1,參考2,參考3,參考4 char ptr,next char tmp1,tmp2,t 申請多個size為0的記憶體 tmp1 char m...