1. 程式人生 > >C語言中全域性變數、全域性靜態變數、區域性變數、區域性靜態變數

C語言中全域性變數、全域性靜態變數、區域性變數、區域性靜態變數

存放位置不同

區域性變數:棧區
靜態區域性變數:靜態區
全域性變數:靜態區的常量區
全域性靜態變數:靜態區

棧區

由編譯器自動分配釋放,存放函式的引數值,區域性變數的值。其操作方式類似於資料結構中的棧。

堆區

一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收。它與資料結構中的堆不同,它的分配方式類似於連結串列。

全域性區(靜態區)

全域性變數和靜態變數的儲存是放在一起的,初始化的全域性變數和靜態變數放在一塊區域,未初始化的全域性變數和未初始化的靜態變數放在相鄰的另一塊區域。程式結束後由系統釋放。

文字常量區

常量字串存放。程式結束後由系統釋放。

程式程式碼區

存放函式體的二進位制程式碼。

作用域

  1. 全域性變數有全域性作用域。全域性變數只需要在一個原始檔中定義,就可以作用於所有的原始檔。不過,在其他不包括全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數。

  2. 靜態全域性變數也有全域性作用域,但是與全域性變數的區別在於全域性變數對於所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。即被static關鍵字修飾過的變數具有檔案作用域,它作用於定義它的檔案裡,不能作用到其他檔案裡。即使兩個不同的原始檔都定義了相同的靜態區域性變數,他們也是不同的變數。不會報錯。

  3. 區域性變數只有區域性作用域,這是自動物件,只在函式執行期存在,函式的一次呼叫結束後,變數就被撤銷,其佔用的記憶體也就被回收了。

  4. 當static用來修飾區域性變數的時候,它就改變了區域性變數的儲存位置,從原來的棧中存放改為靜態儲存區。但是區域性靜態變數在離開作用域之後,並沒有被銷燬,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行訪問。作用域還是區域性作用域。