我獲得了關於靜態變量存儲的衝突意見。存儲靜態變量(數據段或堆或BSS)在哪裏?
意見1:「A 堆靜態變量存儲其在值堆」
意見2:「A 堆靜態變量存儲其在數據段值」 。
我對這些相互矛盾的答案感到困惑。
靜態變量存儲在哪裏?
我期待與參考(教科書,真實教程等)的答案。
靜態變量有兩種類型:
- 函數內聲明的靜態變量。
- 全局(聲明外部函數)靜態變量。
我也想知道這兩種變量的存儲是否有區別?
我獲得了關於靜態變量存儲的衝突意見。存儲靜態變量(數據段或堆或BSS)在哪裏?
意見1:「A 堆靜態變量存儲其在值堆」
意見2:「A 堆靜態變量存儲其在數據段值」 。
我對這些相互矛盾的答案感到困惑。
靜態變量存儲在哪裏?
我期待與參考(教科書,真實教程等)的答案。
靜態變量有兩種類型:
我也想知道這兩種變量的存儲是否有區別?
啓動應用程序時會分配堆棧內存,並且在執行應用程序時始終保持相同大小。它不存儲在DATA段中,DATA段用於應用程序中使用的常量值(如字符串文字)。
'堆棧變量'通常存儲在'堆棧'上,它與程序的文本,數據,bss和堆部分是分開的。
你的問題的後半部分是關於'靜態'變量,它與棧變量不同 - 的確,靜態變量根本就不在棧中。通常,靜態變量將全部位於程序的數據或bss部分。使用現代編譯器,如果數據是常量合格的,那麼數據可以存儲在程序的文本部分,這有很多好處(包括強制的不可修改性)。
C標準沒有規定有堆棧,也沒有bss段。它只需要存儲空間可用於具有適當持續時間的變量。
局部和全局的靜態變量保存在初始化的數據段
有初始化的數據段和未初始化數據段的兩個數據段。
單元化數據段也稱爲BSS。
當我們說數據段時,默認情況下它初始化數據段,這部分從程序的加載映像中複製。 (所有全局變量和本地靜態變量初始化爲非零,即ini var1_global = 10;)
未初始化的數據segemnet aka BSS。這部分將在main()被調用之前初始化爲零。所有單元化的全局,本地靜態都在這裏。
這可能是http://stackoverflow.com/questions/93039/where-are-static-variables-stored-in-cc的副本,但很難說,因爲OP似乎混合「靜態」和「堆疊」。 – 2010-03-25 15:39:39