【问题标题】:What is on my heap? C linux [closed]我的堆上有什么? C linux [关闭]
【发布时间】:2017-09-17 17:11:30
【问题描述】:

所以我今天调用了 malloc(1024) 来处理堆。我在很大程度上了解堆的结构,所以当我打印出内存中的内容时,看到“00000000 00000409 00000000 00000000 ....”并不感到惊讶。

然而 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 的大小如何,它似乎总是在那里。

【问题讨论】:

  • 因为您的机器上还有其他事情发生?还有你期望在那里? (例如:什么是“堆的顶部”?)
  • 您没有使用包含一堆零的字符串调用 print 吗? ASCII 30303030?
  • brk中的移动量(数据段大小的变化)取决于分配器。它可能比您在malloc 通话中实际要求的移动更多。因此,您的数据不一定在堆的顶部。
  • 是否多次运行您的程序,在其间运行其他程序,或者在其间重新启动,显示相同的结果?

标签: c linux heap-memory


【解决方案1】:

malloc 在堆上保留特定数量的内存并返回指向该内存块的指针(或NULL,如果它无法分配所需的内存块)。但是请注意,malloc 不会以任何方式初始化内存块。它不会用0 或任何其他值填充它;它只会保持其内容不变。

所以问题实际上是“程序启动时堆的初始内容是什么?”。答案是:它取决于操作系统,它在执行时分配给程序的内存部分,而这个内存块的内容很可能只是“未定义的东西”,甚至不是随机的。这可以是一些重复出现的值模式,可以是零,也可以是一切。

当您查看程序堆的不同部分时,您可能会看到这个“未定义的东西”内容,无论您之前是否使用过malloc。您可能会看到与您的情况一样的重复模式。但是请注意,“查看”之前未分配的堆部分实际上是未定义的行为。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2010-11-13
    • 2012-09-30
    • 2010-09-17
    • 2011-11-19
    • 2015-07-15
    相关资源
    最近更新 更多