回答
在C代码,具有静态存储持续时间的任何变量被定义为通过该规范(第6.7.8初始化,第10段)被初始化为0:
如果一个对象,该具有静态存储持续时间未明确初始化,则:
- 如果它有指针类型,则它被初始化为空指针;
- 如果它有算术类型,它被初始化为(正或无符号)零;
- 如果它是一个聚合,每个成员根据这些规则初始化(递归);
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员。
一些程序加载器将填补用零整节开始,和其他人将填补其“按需”为演出内容的改进。所以,当你在技术上是正确的,因为.bss
部分可能不真的包含全零的C代码开始执行时,逻辑一样。无论如何,假设您有一个符合标准的工具链,您可以将其视为全零。
被初始化为非零值在.bss
部分永远不会结束了任何变量;它们在.data
或.rodata
部分处理,具体取决于它们的特性。
这取决于变量在代码中的位置。例如,如果你正在讨论main()或其他函数中的局部变量,那么变量会被压入堆栈(除非使用其他修改关键字)。如果你的变量是全局和未初始化的,那么它应该保存在.bss中。请注意,编译器优化等可能会改变一些事情。如果你确实想知道使用readelf来调查linux上的ELF二进制文件。
ELF规范说:
的.bss此节包含未初始化的数据 有助于程序的 内存映像。根据定义,当程序开始运行时, 系统使用零初始化数据 。所述 部分占据没有文件的空间,如由 区段类型, SHT_NOBITS指示。
它因此得出结论,其具有分配给它的值C全局变量不能被放入.bss段,将不得不进入.data段。 .data部分包含分配给它的所有变量的初始值。
看起来好像你可能会对.bss部分结束零初始化的机制感到困惑。您编译的代码无法将区域显式初始化为零,因为操作系统首先为进程分配新页面的内存时,操作系统会确保页面初始化为零。这是出于安全原因而完成的,以便进程无法查找其他进程退出时留在内存中的秘密。
您假定代码正在由操作系统运行,而不是这种情况,这就是为什么当某些变量需要未初始化时,它需要在.bss中。是因为.bss IS实际上是零填充的 – 2013-03-01 00:25:15
- 1. 非.bss未初始化的数据部分
- 2. 部分初始化基类
- 3. struct的部分初始化?
- 4. 字符串文字是否计算为部分初始化器并进行零初始化?
- 5. BSS部分和clearzi
- 6. 变量.BSS部分
- 7. 初始化不带零的数组
- 8. 是malloc()初始化分配数组为零?
- 9. 什么是图像的bss部分?
- 10. Linux程序集; bss节内存初始化为0?
- 11. 如何让MSVC将未初始化的数据放入.bss中?
- 12. Hibernate:部分延迟初始化?
- 13. 未初始化代码的一部分
- 14. nm的未初始化数据部分
- 15. C#结构部分初始化
- 16. 分配初始化
- 17. 分配/初始化
- 18. 核心数据似乎不是初始化的零
- 19. 如何初始化C++中的基本成员初始化部分的std :: map?
- 20. 的Objective-C:初始化变量为零
- 21. 联盟零初始化铿锵VS GCC
- 22. 零的NSXMLParser初始化数据IOS
- 23. 指针vs零初始化指针
- 24. “class var”初始化为零吗?
- 25. NSCalendar初始化展开到零,Swift
- 26. iphone sdk:AVAudioRecorder的初始化返回零
- 27. 成语初始化C++类为零
- 28. 静态初始化结构以零
- 29. SQL Server - 日志文件 - 零初始化
- 30. 变量中获得初始化为零
静态存储持续时间明确初始化为0的任何变量也可能以.bss节结束。 – 2010-08-20 15:31:58