2017-04-20 24 views
0

所以我今天打電話給malloc(1024)只是玩堆。我大部分理解堆的結構,所以當我打印出內存中的內容時,我並不感到驚訝,看到「00000000 00000409 00000000 00000000 ....」我的堆上有什麼? C linux

然而,1032字節後,我預期找到堆的最上面的塊。相反,我發現另一個塊,就好像malloc(1024)的另一個調用發生在我的第一個塊之後。

在此塊如下:

00000000 00000409 30387830 65336234 
30203a30 30303030 20303030 30303030 
30303030 30303020 30303030 30302030 
34303030 33203930 33303330 20303330 
30333033 30333032 33343320 33303330 
33332030 39333032 000a3233 00000000 

翻譯爲:

08x0e3b40 :00000 00000000000000 000000 040003 903030 03003030302343 303033#09302 
23 

有誰知道爲什麼會存在?我確信我只是一次調用malloc。無論我的malloc大小如何,它總是似乎在那裏。

+2

因爲在你的機器上還有其他的事情發生?你還期望在那裏? (例如:什麼是*「堆的頂部塊」*?) – UnholySheep

+1

你沒有任何機會打印包含一堆零的字符串打印? ASCII 30303030? – stark

+1

'brk'中的移動量(數據段大小的改變)取決於分配器。它可能比你在'malloc'調用中實際請求的更多。所以,你的數據不一定在堆的頂部。 – Arash

回答

4

malloc reservers對堆存儲器中的特定量和還給一個指向這個存儲器塊(或NULL,如果它是不能夠分配所需的存儲器塊)。但請注意,malloc不會以任何方式初始化內存塊。它不會填寫0或其他任何值;它會保持原樣。

所以問題實際上是「程序啓動時堆的初始內容是什麼?」。答案是:它依賴於操作系統,執行時分配給程序的內存部分,該內存塊的內容很可能只是「未定義的東西」,甚至不是隨機的。這可能是一些重複出現的價值模式,它可以是零,也可以是一切。

當您查看程序堆的不同部分時,無論您以前是否使用過malloc,您都可能會看到「未定義的內容」。您可能會看到重複出現的模式。但是請注意,「查看」之前尚未分配的堆部分實際上是未定義的行爲。

相關問題