回答
在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