C語言儲存類 鏈結和記憶體管理總結

2021-06-16 20:24:57 字數 2452 閱讀 5415

一、儲存類

作用域:乙個c變數的作用域可以是**塊作用域(在函式內部**塊中定義的變數、形參,稱為區域性變數),函式原型作用域(從變數定義處一直到原型宣告的末尾),或者檔案作用域(乙個在所有函式之外定義的變數,從定義處到包含定義的檔案結尾處都可見,稱為全域性變數),函式作用域(只適應於goto語句使用的標籤),函式作用域意味著乙個特定函式中的goto標籤對該函式中任何地方的**都是可見的,無論該標籤出現在哪乙個**塊中。 鏈結

:乙個c變數具有以下鏈結之一,外部鏈結,內部鏈結或空鏈結。 具有

**塊作用域

和函式原型作用域

的變數是

空鏈結,由定義所在的**塊和函式原型所私有

具有外部鏈結的變數可以在多檔案程式的任何地方使用,多個檔案可有共享。

具有內部鏈結的變數可以在乙個檔案的任何地方使用,歸該檔案私有。

具有檔案作用域的變數可能是內部鏈結或者外部鏈結。

如果乙個具有檔案作用域的變數用static修飾,則是內部鏈結,否則是外部鏈結。

儲存時期

:乙個c變數具有以下兩種儲存時期之一,靜態儲存時期(在程式執行期間一直存在)和自動儲存時期

靜態儲存時期

:在程式執行期間一直存在。具有檔案作用域(不管是內部鏈結還是外部鏈結)的變數具有此儲存週期,注意對於具有檔案作用域的變數,static標明連線型別不是儲存時期。

自動儲存時期

:具有**塊作用域的變數一般是自動儲存週期。在程式進入定義的變數**塊中時在棧中分配記憶體,退出時釋放記憶體。

5

種儲存類

儲存類時期作用域

鏈結宣告方式

自動自動

**塊空

**塊內

暫存器自動

**塊空

**塊內,使用關鍵字register

具有外部鏈結的靜態

靜態檔案

外部所有函式之外

具有內部鏈結的靜態

靜態檔案

內部所有函式之外,使用關鍵字static

空鏈結的靜態

靜態**塊

空**塊內,使用關鍵字static

自動變數

:用auto修飾或者不修飾就預設屬於自動儲存類的變數具有自動儲存週期、**塊作用域、空鏈結。在預設下,在**快或者函式的頭部定義的任意變數都屬於自動儲存類。

如果在內層中使用和外層一樣名字的變數,則內層會覆蓋外層變數,在程式離開內層**塊時,外部變數就恢復了其作用和之前的值。

對於自動變數,除非顯示的初始化,否則不會自動初始化。

暫存器變數:通過register宣告,放在暫存器而非記憶體中,所以無法獲得其位址。注意,有時候雖然請求了把變數放於暫存器中,但是由於暫存器的個數,並不一定能滿足,所以暫存器變數就成為了普通變數,不過依然不能對其取址。

具有**塊作用域的靜態變數:通過static

修飾,如果不現實對其初始化,則自動初始化為0(提供了靜態時期),在**塊內宣告(提供了**塊作用域和空鏈結),建立具有**塊作用域兼具靜態儲存的區域性變數。這些變數具有**塊作用域,空鏈結,靜態儲存時期。變數一旦被定義便一直存在直到程式結束。

int main(void)

return 0; }

void f(void)

結果:

count = 1

fade = 1 andstay = 1;

count = 2

fade = 1 andstay = 2;

count = 3

fade = 1 andstay = 3;

這是因為靜態變數和外部變數在程式調入記憶體時已經就位了,把這個語句放在f()中是為了告訴編譯器只有函式f()能看到該變數。

具有外部鏈結的靜態變數:具有檔案作用域、外部鏈結、靜態時期(外部儲存類,外部變數)。

額外說明,外部變數只可進行一次初始化,而且在定義的時候。

具有內部鏈結的靜態變數:用static在所有函式的外部進行定義來建立,靜態儲存時期、檔案作用域、內部鏈結。

二、儲存類說明符

auto 標明乙個變數具有自動儲存時期,該說明符只能用在具有**塊作用域的變數宣告中。

register 只能用在具有**塊作用域的變數。請求乙個變數儲存在暫存器中一邊快速使用,但是不能獲得改變量的位址。

static 用於具有**塊作用域的變數宣告時,使該變數具有靜態儲存時期,從而得以在程式執行期間存在並保留其值,變數仍保留**塊作用域和空鏈結。若用於具有檔案作用域的變數宣告時,使該變數具有內部鏈結。

extern 表明在宣告乙個在其他地方定義了的變數。

const  將資料定為不變的,在只能定義宣告,以後不可改變其值。在指標中使用時,const的位置決定是指標本身不變還是指標指向的資料不變。

volatile 說明資料除了可以被程式修改外還可以被其他**修改,主要用於編譯器優化。

restrict 只能用於修飾指標,限定的指標被認為是提供了對其所在指向的資料塊的唯一訪問途徑。

C 儲存類 鏈結 記憶體管理

用於儲存程式資料的記憶體可用儲存時期 作用域 鏈結來表徵。儲存時期可以是靜態的 自動的 或是分配的。如果是靜態的,內存在程式開始執行時被分配,並在程式執行時一直存在。如果是自動的,變數所用內在程式執行到該變數定義所在 塊時才開始分配,退出 塊時釋放。如果是分配的記憶體,記憶體通過呼叫malloc 分...

儲存類,鏈結和記憶體管理

一,儲存類 不同的儲存類提供了變數的作用域,鏈結以及儲存時期的不同組合。儲存時期,作用域,鏈結 儲存時期 變數在記憶體中保留的時間。函式原型作用域從變數定義處一直到原型宣告的末尾。這說明編譯器在處理乙個函式的引數時,它所關心的只是該引數的型別。乙個在所有函式之外定義的變數具有檔案作用域。二,鏈結 關...

儲存類 鏈結和記憶體管理

作用域 鏈結乙個 變數具有下列鏈結之一 外部鏈結 內部鏈結或空鏈結。具有 塊作用域或者函式原型作用域的變數有空鏈結,意味著它們是由其定義所在的 塊或者函式原型所私有的。具有檔案作用域的變數可能有內部或者外部鏈結。乙個具有外部鏈結的變數可以在乙個多檔案程式的任何地方使用。乙個具有內部鏈結的變數可以在乙...