2016-06-01 38 views

回答

3

wiki說:

在C語言編程,靜態使用全局變量 和功能在其範圍設置爲包含文件。在本地 變量中,靜態用於將變量存儲在靜態分配的內存中,而不是自動分配的內存中。 雖然 語言沒有規定任一類型的 存儲器的實現,靜態分配的存儲器通常在數據在編譯時保留 段的程序,而自動 分配的存儲器作爲瞬時調用堆棧通常實現。

靜態局部變量:雖然具有相同的範圍內自動 局部變量聲明爲靜態函數 內部變量是靜態分配的。因此,當再次調用 函數時,函數在一次調用期間將靜態局部變量放入其 的任何值仍將存在。

+0

謝謝你拉胡爾。所以靜態變量在編譯時獲得內存分配,對嗎? –

+2

感謝您強調實施不是由該語言指定的。 – phoxis

+2

@seereddisekhar在運行可執行文件時,它們實際上並沒有在編譯時進行分配,因此加載程序會根據可執行文件中指定的內容來調整內存中的可執行文件。因此,實際分配將在加載時發生,但編譯規範時,將定義相對地址和偏移量。 – phoxis

3

是的,靜態變量在函數調用之間持續存在。它們駐留在程序的數據部分,如全局變量。

您可以(也可能應該)更多地瞭解C應用程序here的一般內存佈局。

+0

函數調用完成後數據段不會被清除? –

+0

不,功能完成時數據段不受影響。 – kaspersky

1

您做了一個錯誤的假設,即static變量放置在堆棧上*當使用它們的函數正在運行時,所以需要保存和檢索它們。

這不是C如何做的:靜態變量被分配在堆棧外的完全不同的內存段中,所以當函數結束其自動變量的作用域時,它們不會被釋放。

通常,靜態數據段在進入程序時被創建並初始化一次。之後,只要您的程序正在運行,段就會保持分配狀態。所有的全局變量以及來自所有函數的靜態變量都由編譯器放置在該段中。這就是爲什麼進入或離開功能對這些變量沒有影響。

*「堆棧」的正式名稱是「自動存儲區域」。

3

添加預先給予答案的頂部一些更多的信息 -

存儲靜態對象在編譯/鏈接時被分配。他們的地址由鏈接器根據鏈接器控制文件修復。

鏈接器文件定義了物理存儲器佈局(Flash/SRAM)和不同程序區域的放置。

靜態區域實際上又細分爲兩個其他部分,一個用於初始值,另一個用於運行時間所做的更改。

最後,請記住,如果您不另行指定,編譯期間該值將被設置爲0。

0

考慮這個例子:

static int foo; 

void f(void) 
{ 
    static int bar; 
} 

唯一的區別和之間FOO欄是FOO具有文件作用域而酒吧具有功能範圍。這兩個變量都存在於程序的整個生命週期中。