1. 程式人生 > >C語言變數的型別和儲存位置

C語言變數的型別和儲存位置

1. C語言變數主要分為全域性變數、靜態全域性變數、區域性變數、靜態區域性變數和暫存器變數。其中靜態變數用static關鍵字進行修飾。程式所佔用的記憶體可以分為以下幾個部分:

(1)程式碼段-存放程式程式碼,只讀的,不能修改。

(2)全域性區(靜態區),又稱為資料段。其中.data段存放的是已經初始化的全域性變數和靜態變數(靜態全域性變數和靜態區域性變數)。.bss段存放的是未初始化的全域性變數和靜態變數(靜態全域性變數和靜態區域性變數)。bss段會將未初始化的變數填充為0.

(3) 堆: 是一種線性結構,類似連結串列實現,也可由其它方法實現。malloc, realloc函式一般從堆上分配記憶體。注意:和資料結構中的堆不同。

(4) 棧: 後進先出結構。主要儲存的是區域性變數,函式形參,以及函式地址。

(5)常量區:儲存字串常量。

2. 變數的生存期和作用域

全域性變數: 全域性變數的作用域是整個源程式,即多個檔案中有效。通過extern宣告。

靜態全域性變數: 靜態全域性變數和全域性變數的儲存域是相同的,都儲存在資料段。但作用域不相同,用static宣告的靜態全域性變數作用域被限制在本檔案內。在檔案外是無效的。函式或變數前加static,可防止命名衝突。

區域性變數: 區域性變數是定義在函式體內的,當函式執行結束後,就自動釋放。作用域為整個函式體。

靜態區域性變數: 與區域性變數不同的是,它儲存在全域性區或是靜態區,區域性變數儲存在棧上。靜態區域性變數的作用域也是函式體,函式體外無效。但當函式執行完之後,靜態區域性變數一直存在,下次呼叫時可以直接利用上次儲存的值,即靜態區域性變數就初始化1次,不會重複初始化。


如果在標頭檔案聲明瞭靜態變數,那麼每個包含該標頭檔案的原始檔中的靜態變數地址都是不相同的,即視為不相同的變數,這樣可以防止變數重定義。也說明了靜態全域性變數將作用域限制在了檔案內。

3. 可以通過readelf -a 可執行檔案,檢視每個段情況。