聲明爲auto
和static
的變量之間有什麼區別? auto
和static
變量的內存分配有什麼區別? 爲什麼我們在指針數組中使用static
,它的意義是什麼?存儲類別
存儲類別
回答
我假設你是在談論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
可能還應該提到以下內容:'auto'變量只能在函數內部聲明,而'static'變量也可以在函數外聲明。實際上,頂層變量的行爲總是像'static',而函數局部變量的行爲默認爲'auto'。 – stakx 2010-04-18 06:49:30
@stakx:全局變量的行爲不像默認情況下聲明爲靜態,靜態對於它們意味着與函數範圍靜態不同。 – 2010-04-18 06:52:07
@stakx:與非靜態變量(全局變量,外部變量)不同,在函數外聲明的靜態變量在它們定義的翻譯單元外是不可見的。但就持續時間而言,你是正確的;靜態變量和全局變量都具有程序持續時間的生命週期。 – 2010-04-18 06:52:15
AUTO(默認),靜態,EXTERN & 註冊是4種改性劑中的變量C.
AUTO :默認。正常變量。
STATIC:更改變量的生存期。 (保留範圍,不更改 )。
這意味着,在運行期間,操作系統會在每次調用該函數後刪除變量從內存中刪除變量(包含變量退出)並初始化該變量。
而是靜態變量僅在函數第一次被初始化(包含它被調用時)。然後它繼續駐留在內存中,直到程序終止。 換句話說STATIC在內存中有效地生成一個變量GLOBAL,但只有LOCAL訪問權限。
你的靜態存儲位置取決於它們是否被初始化。
0初始化的靜態數據都會在.BSS(塊由符號開始),
非0初始化的數據都會在.DATA
必須注意的是,雖然static-變量總是在內存中,它們只能從本地範圍(它們被定義的函數)訪問。
EXTERN:用於向編譯器發出信號,表明extern-definition只是一個佔位符,實際的定義是其他位置。將變量聲明爲extern將導致程序不會爲其聲明的範圍中的變量保留任何內存。找到聲明爲extern的函數原型也很常見。
寄存器:指示編譯器優先使用CPU寄存器(而不是RAM)來存儲此變量。 用於提高性能,當重複訪問變量時(例如:循環計數器變量)。
+1,但是..「靜態:對於全局變量,表示內部連接。對於函數範圍變量,表示它們持續跨越函數調用。」,「外部:表示聲明只是聲明而不是定義。」,註冊:... 99.999%已過時。「 – 2010-04-18 07:05:30
好的,你現在已經搞定了一個編輯。函數範圍靜態不存儲在堆上。 – 2010-04-18 07:14:54
@RERER你確定?因爲我似乎記得閱讀它。 PLus自從函數返回後清除棧,U怎麼解釋靜態變量保留它們的值呢? plz解釋... – TheCodeArtist 2010-04-18 07:17:55
汽車: - 自動存儲類是默認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/
- 1. 存儲與用戶關聯的類別和子類別
- 2. 如何存儲博客類別SQL
- 3. 爲'gdt_flush'指定的存儲類別
- 4. 數據存儲類別與字符串:有什麼區別?
- 5. 類型和類之間的數據存儲區別
- 6. 選擇和瀏覽類別和子類別存儲在單獨的表格
- 7. 如何更新S3存儲桶中所有項目的存儲類別?
- 8. 別名'存儲在Ubuntu 10.04
- 9. 聲明存儲類
- 10. 存儲庫類型
- 11. 存儲Zend子類
- 12. 數據庫管理以商品來存儲他們的類別
- 13. 的SQL Server 2008:計數的存儲類別
- 14. 如何在執行存儲過程後識別數據類型?
- 15. 在類級別屬性中存儲實例(自我)的列表?
- 16. 在文本區域按類別存儲不同的li項目
- 17. joomla - 存儲類別的順序在哪裏?
- 18. 如何在Wordpress中將類別存儲到數組變量?
- 19. 爲每個配置文件存儲屬性/類別排序
- 20. 高效地將多個密鑰存儲在一個類別中
- 21. GAE數據存儲中種類和實體的區別?
- 22. 存儲類別(多個父節點)的數據模型
- 23. WordPress的:獲取和存儲類別信息
- 24. 將存儲值的類別輸出到列表中
- 25. 用於存儲圖像類別的最佳邏輯
- 26. 存儲來自不同類別的輸入
- 27. 數據庫中的Woocommerce產品類別數存儲在哪裏?
- 28. 訂購類別(列),因爲它們存儲在解析後端
- 29. Prestashop 1.6:類別圖像存儲在哪裏?
- 30. 存儲過程和擴展存儲過程之間的區別
如果你被告知要始終聲明指針數組作爲靜態的,這是錯誤的。然而,在特定的情況下它可能是適當的,但不是因爲存儲在數組中的類型。 – 2010-04-18 06:54:08