2017-04-20 69 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,您都可能会看到“未定义的内容”。您可能会看到重复出现的模式。但是请注意,“查看”之前尚未分配的堆部分实际上是未定义的行为。