2010-04-18 37 views
4

聲明爲autostatic的變量之間有什麼區別? autostatic變量的內存分配有什麼區別? 爲什麼我們在指針數組中使用static,它的意義是什麼?存儲類別

+1

如果你被告知要始終聲明指針數組作爲靜態的,這是錯誤的。然而,在特定的情況下它可能是適當的,但不是因爲存儲在數組中的類型。 – 2010-04-18 06:54:08

回答

2

我假設你是在談論auto變量你可能意味着函數中的局部變量。 auto是默認值,它表示變量在函數調用時在堆棧上分配,並在函數返回時解除分配。 static表示變量在第一次調用該函數時被分配,並且保留爲程序的其餘部分分配。這意味着:

int foo() { 
    static int x = 0; 
    return x++; 
} 

printf("%d\n", foo()); // Outputs 0 
printf("%d\n", foo()); // Outputs 1 
printf("%d\n", foo()); // Outputs 2 
+0

可能還應該提到以下內容:'auto'變量只能在函數內部聲明,而'static'變量也可以在函數外聲明。實際上,頂層變量的行爲總是像'static',而函數局部變量的行爲默認爲'auto'。 – stakx 2010-04-18 06:49:30

+0

@stakx:全局變量的行爲不像默認情況下聲明爲靜態,靜態對於它們意味着與函數範圍靜態不同。 – 2010-04-18 06:52:07

+0

@stakx:與非靜態變量(全局變量,外部變量)不同,在函數外聲明的靜態變量在它們定義的翻譯單元外是不可見的。但就持續時間而言,你是正確的;靜態變量和全局變量都具有程序持續時間的生命週期。 – 2010-04-18 06:52:15

5

AUTO(默認)靜態EXTERN & 註冊是4種改性劑中的變量C.


  • AUTO :默認。正常變量。

  • STATIC更改變量的生存期。 (保留範圍,不更改 )。

    這意味着,在運行期間,操作系統會在每次調用該函數後刪除變量從內存中刪除變量(包含變量退出)並初始化該變量。

    而是靜態變量僅在函數第一次被初始化(包含它被調用時)。然後它繼續駐留在內存中,直到程序終止。 換句話說STATIC在內存中有效地生成一個變量GLOBAL,但只有LOCAL訪問權限。

    你的靜態存儲位置取決於它們是否被初始化。

    • 0初始化的靜態數據都會在.BSS(塊由符號開始),

    • 非0初始化的數據都會在.DATA

    必須注意的是,雖然static-變量總是在內存中,它們只能從本地範圍(它們被定義的函數)訪問。

  • EXTERN:用於向編譯器發出信號,表明extern-definition只是一個佔位符,實際的定義是其他位置。將變量聲明爲extern將導致程序不會爲其聲明的範圍中的變量保留任何內存。找到聲明爲extern的函數原型也很常見。

  • 寄存器:指示編譯器優先使用CPU寄存器(而不是RAM)來存儲此變量。 用於提高性能,當重複訪問變量時(例如:循環計數器變量)。

+1

+1,但是..「靜態:對於全局變量,表示內部連接。對於函數範圍變量,表示它們持續跨越函數調用。」,「外部:表示聲明只是聲明而不是定義。」,註冊:... 99.999%已過時。「 – 2010-04-18 07:05:30

+1

好的,你現在已經搞定了一個編輯。函數範圍靜態不存儲在堆上。 – 2010-04-18 07:14:54

+0

@RERER你確定?因爲我似乎記得閱讀它。 PLus自從函數返回後清除棧,U怎麼解釋靜態變量保留它們的值呢? plz解釋... – TheCodeArtist 2010-04-18 07:17:55

1

汽車: - 自動存儲類是默認class.if我們定義一個函數中的變量,而不定義任何存儲然後它會自動提升爲自動變量。以簡單的方式,我們可以說局部變量(非靜態)是一個自動變量。自動變量的範圍在函數內聲明和存活的函數內。

例如

int main() 
     { 
     int a =10; 
      { 
      int b=10; 
      } 
     printf("%d",b); 
    } 

在上面的例子中A和B兩者都是局部變量都是活,直到主功能內的控制,但是,大括號,他們是define.when內的可視性和b我們嘗試編譯上面的代碼,我得到錯誤: - 未聲明的變量b。

int main() 
{ 
    int a =10; 
    int *d; 
    { 
    int b=20; 

    d=&b; 
    } 
    printf("%d",*d); 

    } 

輸出 20原因是b活着直到控制駐留在主函數。

靜: -
當我們使用靜態(前綴)與可變那麼它活着穿過程序的整個運行。意味着程序整個運行過程中的靜態變量範圍。它聲明的模塊內的靜態變量範圍。 如果我們將static和全局變量一起使用,那麼全局變量的作用域限於它聲明的文件。換句話說,我們可以說靜態爲其聲明的文件創建一個變量或函數。
當我們初始化一個靜態變量時,它會在數據段(.ds)中創建它或者在該進程的.bss(塊啓動符號)中創建。

注: - 靜態變量初始化在編譯時,當內存分配它。如果我們不能初始化,那麼它的編譯器的責任與零進行初始化。

根據我的經驗,當你創建一個查找表或任何需要整個程序運行的表,並且你想使它成爲一個特定的文件,那麼你聲明爲靜態。

更多的知識看此鏈接:http://aticleworld.com/storage-class/