如果全局或静态 C 变量未显式初始化,而是隐式初始化,那么它是在 .data 还是 .bss 部分中?

如果全局或静态 C 变量未显式初始化,而是隐式初始化,那么它是在 .data 还是 .bss 部分中?

计算机系统:程序员的视角介绍了 ELF 可重定位目标文件中的两个部分:

  • 。数据初始化的全局和静态 C 变量。局部 C 变量在运行时在堆栈上维护,不会出现在 .data 或 .bss 部分中。

  • .bss未初始化的全局和静态 C 变量,以及初始化为零的任何全局或静态变量。该部分在目标文件中不占用实际空间;它只是一个占位符。目标文件格式区分已初始化变量和未初始化变量以提高空间效率:未初始化变量不必占用目标文件中的任何实际磁盘空间。在运行时,这些变量在内存中分配,初始值为零。

引用中的“initialized”和“unitialized”是显式还是隐式的意思?

如果全局或静态 C 变量未显式初始化,而是隐式初始化,那么它是在 .data 还是 .bss 部分中?

全局或静态 C 变量是否隐式初始化为零或非零有关系吗?

.data 和 .bss 的要求并不相互排斥。 “初始化全局和静态 C 变量”的 .data 要求并未规定此类变量必须初始化为非零。因此,如果全局或静态 C 变量初始化为零,它应该位于 .data 还是 .bss 部分?

谢谢。

答案1

引用中的“initialized”和“unitialized”是显式还是隐式的意思?

“初始化”意味着变量在代码中的声明旁边被赋予一个显式值(可能为零)。 “未初始化”意味着变量在声明时未显式初始化,这在您的术语中对应于“隐式初始化”;如果它是全局变量,则其值为零。

如果全局或静态 C 变量未显式初始化,而是隐式初始化,那么它是在 .data 还是 .bss 节中?

根据你的报价:

.bss未初始化的全局和静态 C 变量

下一个:

全局或静态 C 变量是否隐式初始化为零或非零重要吗?

未初始化的全局变量默认为零值。

因此,如果全局或静态 C 变量初始化为零,它应该位于 .data 还是 .bss 部分?

根据你的报价:

.bss未初始化的全局和静态 C 变量,以及初始化为零的任何全局或静态变量。

请注意,这些都不是要求;特别是,它假设未初始化的数据段在平台上被初始化为与 C 中的零相对应的值。这是使用 ELF 的系统上的典型情况,但 C 允许用除全零之外的位模式来表示零。

.bss然而在实践中,显式或非显式初始化为零的全局或静态变量是ELF 二进制文件的一部分。

相关内容