【问题标题】:difference between stack segment and uninitialized data segment堆栈段和未初始化数据段的区别
【发布时间】:2017-11-15 07:21:32
【问题描述】:

我试图获得 c 中的内存分配。

根据following link,栈和未初始化的数据段是不同的,本地函数的未初始化的数据去未初始化的数据段。

如果是这种情况,那么在代码具有未初始化的局部变量的情况下,堆栈段中存储了什么?是空的吗?

【问题讨论】:

  • 只有堆栈分配的数据进入堆栈——非静态局部变量。这适用于变量是否被初始化。静态局部变量进入数据段。如果它们没有被显式初始化,它们可能在 BSS 部分,如果它们被初始化为非零值,它们可能在数据段的初始化部分。

标签: c


【解决方案1】:

我不建议阅读“geeksforgeeks”教程。你有一些误解。

他们所谓的“未初始化数据”,.bss 段,实际上是用于存储零初始化的静态存储持续时间的变量。包括显式初始化为零值的任何此类变量。 静态存储时长和不同公共段的解释,并附有示例,可以找到here

具有静态存储持续时间的变量以 .bss.data 结尾。局部变量总是在栈上,或者在 CPU 寄存器中,不管它们是否被初始化。

(请注意,这些都不是由 ISO C 标准规定的,而是由行业事实标准规定的。)

【讨论】:

  • 能否详细说明“静态存储时长”?所以本地静态未初始化变量最终在 .data 中对吗?
  • @nalinkanoongo 一切都在发布的链接中进行了解释。
  • 知道了。谢谢
  • “包括任何明确初始化为零值的变量。”。大脚注在这里。各种工具链已经对此改变了几次想法,不同的系统可能会对此进行不同的配置。在更新 gcc 或 ld 或其他任何内容后被它咬住了,并且二进制修补内核的方法不再起作用(我们将 ramdisk 映像转储到内核中的一个大数组中,工具链将其从数据移动到 bss) .我知道有些系统在遇到类似问题时会显式更改工具链的默认行为。
【解决方案2】:

本地函数的未初始化数据进入未初始化数据段。

嗯,这并不完全正确。

仔细阅读,(from the same link,强调我的)

[...] 未初始化的数据从数据段的末尾开始,包含所有初始化为零或在源代码中没有显式初始化的全局变量和静态变量。 [. ..]

因此,自动存储变量仍然驻留在堆栈段中,无论它们是否被初始化。

也就是说,请注意,这是“典型的记忆表示”,不是通用的。就此而言,C 标准并没有强制要求有一个堆栈段(或任何其他)。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 2011-05-14
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多