1. 程式人生 > >C語言---變數儲存期

C語言---變數儲存期

    作用域和連結描述了識別符號的可見性。儲存期描述了通過這些識別符號訪問的物件的生存期。C物件有4種儲存期:靜態儲存期、執行緒儲存期、自動儲存期、動態分配儲存期。

    如果物件具有靜態儲存期,那麼它在程式的執行期間一直存在。檔案作用域變數具有靜態儲存期。注意,對於檔案作用域變數,關鍵字static表明了其連結屬性,而非儲存期。以static宣告的檔案作用域變數具有內部連結。但是無論是內部連結還是外部連結,所有的檔案作用域變數都具有靜態儲存期。

    執行緒儲存期用於併發程式設計,程式執行可被分為多個執行緒。具有執行緒儲存期的物件,從被宣告時到執行緒結束一直存在。以關鍵字_Thread_local宣告一個物件時,每個執行緒都獲得該變數的私有備份。

    塊作用域的變數通常    都具有自動儲存期。當程式進入定義這些變數的塊時,為這些變數分配記憶體;當推出這個塊時,釋放剛才為變數分配的記憶體。這種做法相當於把自動變數佔用的記憶體視為一個可重複使用的工作區或暫存區。例如,一個函式呼叫結束後,其變數佔用的記憶體可用於儲存下一個被呼叫函式的變數。

    變長陣列稍有不同,他們的儲存期從宣告處到塊的末尾,而不是從塊的開始處到塊的末尾。

    我們到目前為止使用的區域性變數都是自動類別。例如,在下面的程式碼中,變數number和index在每次呼叫bore()函式時被建立,在離開函式時被銷燬:

void bore(int number)
{
    int index;
    for(index = 0;index<number;index++)
       puts("They don't make them the way they used to.\n");
    return 0;
}

      然而,塊作用域變數也能具有靜態儲存期。為了建立這樣的變數,要把變數宣告在塊中,且在宣告前面加上關鍵字static:

void more(int number)
{
    int index;
     static int ct = 0;
     ....
    return 0;
}

    這裡,變數ct儲存在靜態記憶體中,他從程式被載入到程式結束期間都存在。但是,它的作用域定義在more()函式塊中。只有在執行該函式時,程式才能使用ct訪問它所指定的物件(但是,該函式可以給其它函式提供該儲存區的地址以便方便間接訪問該物件,例如通過指標形參或返回值)。

    C使用作用域、連結和儲存期為變數定義了多種儲存方案。由於目前不涉及併發程式設計,所以不再贅述這方面的內容。已分配儲存期在後面更新。因此,剩下5種儲存類別:自動、暫存器、靜態塊作用域、靜態外部連結、靜態內部連結,如表所示。

5種儲存類別
儲存類別 儲存期 作用域 連結 宣告方式
自動 自動 塊內
暫存器 自動 塊內,使用關鍵字 register
靜態外部連結 靜態 檔案 外部 所有函式外
靜態內部連結 靜態 檔案 內部 所有函式外,使用關鍵字 static
靜態無連結 靜態 塊內,使用關鍵字 static