2013-01-09 44 views
0

程序中的靜態變量存在於所有執行時間的存儲器中,而子程序的靜態變量被創建(通過調用子程序)並被銷燬通過將子程序的激活記錄推入並從程序的函數調用堆棧中彈出來完成,但是:程序中塊內靜態變量的存儲器概念

如何處理塊中的靜態變量(我的意思是控制結構或任何{}塊)主程序裏面?他們不能在他們被定義的塊之外訪問,他們的內存概念如何?

它們在整個程序執行過程中是否存在於存儲器中,但不能在其塊之外訪問,或者除了子程序以外的每個塊都有激活記錄?

+0

無論哪種方式將工作。 –

+0

[Local scope。](http://msdn.microsoft.com/zh-cn/library/b7kfh662.aspx)在塊中聲明的名稱只能在該塊及其所包含的塊內訪問,並且只能在該點申報。 [靜態](http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx)關鍵字。 – sergmat

+0

找到了答案 這裏:http://stackoverflow.com/questions/2759371/in-c-do-braces-act-as-a-stack-frame 和 這裏HTTP ://stackoverflow.com/questions/8927086/will-a-new-stack-frame-be-created-on-entering-a-block-of-statements – MTVS

回答

0

所有情況下的靜態變量都會在程序的整個生命週期內分配一次。 (我認爲你的問題中的「子程序」是指C函數。)你的問題是特定於正在使用的編程語言的,所以我將假設C.

代碼塊「 「(或者看不到)靜態變量是單獨的,並且是由編譯器的詞法範圍規則強制執行的虛構。

具體在C中,static變量在全局範圍內,函數範圍和塊範圍在程序的整個生命週期中,每個程序都存儲一次。

static int globalWord; 

int aFunction(void) { 
    static int aFunctionPrivateStatic; 
} 

int main(void) { 
    while (1) { 
    static int whilePrivateStatic; 
    // ... 
    } 

    // ... 
} 

爲更徹底的例子參見http://en.wikipedia.org/wiki/Static_variable:在以下示例中(至少)3個字將在程序啓動時分配的。

+0

好的,但本地變量的默認存儲類是自動的,實際上主變量中的變量的存儲類也是自動的,但它們在整個執行時間內都是持久的。 – MTVS