2014-03-19 40 views
0
BOOL foo(void){ 

    static BOOL displayed = FALSE; 
    static BOOL initialized = FALSE; 

    if (displayed) 
     return FALSE; 

    //more code 

    displayed = TRUE; 
    return FALSE; 
} 

C中靜態局部變量的含義是什麼?C中靜態局部變量的含義是什麼?

如果第二次調用此方法,displayed將不會重新初始化爲FALSE?

+0

https://stackoverflow.com/questions/14992116/cc-the-purpose-of-static-const-local-variable – Brian

+0

可能重複[什麼是靜態局部變量的用法,當我們可以得到一個全局變量在同樣的成本?](http://stackoverflow.com/questions/15808049/what-is-the-use-of-static-local-variable-when-we-can-get-a-global-variable-at -th) – Brian

+0

如果第二次調用此方法,顯示將不會重新初始化爲FALSE? - 不,它會保留上次分配給它的值 –

回答

4

靜態局部變量在程序啓動之前僅初始化一次。然後他們的價值觀在調用之間持續存在。

從標準,部分6.2.4/3存儲對象的持續時間:

其標識符,而不存儲類說明 _Thread_local被聲明,並且用外部或內部聯動裝置或與一個對象存儲級 說明靜態,具有靜態存儲持續時間。它的生命週期是 程序的全部執行,並且在程序啓動之前,其存儲值僅初始化一次。

+0

,這很奇怪。當我的代碼重新分配這個靜態變量,它會改變一次。 –

+0

我不明白,在我的代碼中有評論 –

+0

有一行'顯示= TRUE;',我看到它只改變了一次的值。你說在程序啓動之前該值被設置了一次。「但是我看到它在第一次運行後會改變一次 –

0

在編譯器分配內存時,初始化只執行一次。該變量在程序執行期間保留其值。

1

靜態變量僅初始化一次。 這可以在特殊情況下使用,如計算函數的運行時執行次數。 靜態變量的生存時間與全局變量相同。但是它們的範圍僅限於定義的範圍。

0

靜態自動變量即使在其定義的塊終止之後仍然存在。因此,函數中靜態變量的值在對同一函數的重複函數調用之間保留。靜態自動變量的範圍與自動變量的範圍相同,即它在其定義的塊中是局部的;然而,分配的存儲在程序期間變爲永久存儲。靜態變量可以在其聲明中初始化;然而,初始化器必須是常量表達式,並且在爲靜態變量分配內存時,在編譯時僅初始化一次。

相關問題