2010-03-25 91 views
2

我獲得了關於靜態變量存儲的衝突意見。存儲靜態變量(數據段或堆或BSS)在哪裏?

意見1:「A 靜態變量存儲其在值

意見2:「A 靜態變量存儲其在數據段值」 。

我對這些相互矛盾的答案感到困惑。

靜態變量存儲在哪裏?

我期待與參考(教科書,真實教程等)的答案。

靜態變量有兩種類型:

  1. 函數內聲明的靜態變量。
  2. 全局(聲明外部函數)靜態變量。

我也想知道這兩種變量的存儲是否有區別?

+0

這可能是http://stackoverflow.com/questions/93039/where-are-static-variables-stored-in-cc的副本,但很難說,因爲OP似乎混合「靜態」和「堆疊」。 – 2010-03-25 15:39:39

回答

0

啓動應用程序時會分配堆棧內存,並且在執行應用程序時始終保持相同大小。它不存儲在DATA段中,DATA段用於應用程序中使用的常量值(如字符串文字)。

10

'堆棧變量'通常存儲在'堆棧'上,它與程序的文本,數據,bss和堆部分是分開的。

你的問題的後半部分是關於'靜態'變量,它與棧變量不同 - 的確,靜態變量根本就不在棧中。通常,靜態變量將全部位於程序的數據或bss部分。使用現代編譯器,如果數據是常量合格的,那麼數據可以存儲在程序的文本部分,這有很多好處(包括強制的不可修改性)。

C標準沒有規定有堆棧,也沒有bss段。它只需要存儲空間可用於具有適當持續時間的變量。

0

局部和全局的靜態變量保存在初始化的數據段

有初始化的數據段和未初始化數據段的兩個數據段。

單元化數據段也稱爲BSS。

當我們說數據段時,默認情況下它初始化數據段,這部分從程序的加載映像中複製。 (所有全局變量和本地靜態變量初始化爲非零,即ini var1_global = 10;)

未初始化的數據segemnet aka BSS。這部分將在main()被調用之前初始化爲零。所有單元化的全局,本地靜態都在這裏。

http://www.geeksforgeeks.org/memory-layout-of-c-program/

相關問題