全域性變數和靜態變數

2021-06-18 18:46:45 字數 1583 閱讀 6637

變數可以分為全域性變數、靜態全域性變數、靜態區域性變數和區域性變數

按儲存區域分:全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區

按作用域分:全域性變數在整個工程檔案內都有效;靜態全域性變數只在定義它的檔案內有效;靜態區域性變數只在定義它的函式內有效,只是程式僅分配一次記憶體,函式返回後,該變數不會消失;區域性變數在定義它的函式內有效,但是函式返回後失效。

全域性變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。區域性變數的值不可知。

靜態變數可以實現多個函式和檔案共享,而其值還不改變只需在標頭檔案裡定義static cstring url or static ...之類的就行了

靜態變數和全域性變數是兩碼事

靜態變數相對於自動變數,之所以稱為靜態變數,是說靜態變數不隨著程式作用域的改變而銷毀。但是靜態變數的訪問受到作用域的制約。

自動變數是在函式呼叫棧中分配的,因此隨著函式的退出,自動變數不能繼續儲存原來的值。

而靜態變數是在堆中分配的,編譯器會對靜態變數進行初始化,並且靜態變數在整個程式中只有乙個,而不像自動變數那樣,會根據函式呼叫的不同具有多個副本。靜態變數的值在函式退出後不變。

全域性變數是指變數的作用域範圍是全域性可見。而變數作用域決定於變數生命的位置。就是說在所有花括號之外宣告的變數即是全域性變數

一般認為在c中分為這幾個儲存區

1棧 - 有編譯器自動分配釋放

2堆 - 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**

3全域性區(靜態區),全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數

和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊

區域。 - 程式結束釋放

4另外還有乙個專門放常量的地方。 - 程式結束釋放

在函式體中定義的變數通常是在棧上,用malloc, calloc, realloc等分配記憶體的函

數分配得到的就是在堆上。在所有函式體外定義的是全域性量,加了static修飾符後不

管在**都存放在全域性區(靜態區),在所有函式體外定義的static變數表示在該文

件中有效,不能extern到別的檔案用,在函式體內定義的static表示只在該函式體內

有效。另外,函式中的"adgfdf"這樣的字串存放在常量區。

比如:int a = 0; 全域性初始化區

char *p1; 全域性未初始化區

main()

還有就是函式呼叫時會在棧上有一系列的保留現場及傳遞引數的操作。

棧的空間大小有限定,vc的預設是2m。棧不夠用的情況一般是程式中分配了大量陣列

和遞迴函式層次太深。有一點必須知道,當乙個函式呼叫完返回後它會釋放該函式中

所有的棧空間。棧是由編譯器自動管理的,不用你操心。

堆是動態分配記憶體的,並且你可以分配使用很大的記憶體。但是用不好會產生記憶體洩漏

。並且頻繁地malloc和free會產生記憶體碎片(有點類似磁碟碎片),因為c分配動態

記憶體時是尋找匹配的記憶體的。而用棧則不會產生碎片。

在棧上訪問資料比通過指標在堆上訪問資料快些。

一般大家說的堆疊和棧是一樣的,就是棧(stack),而說堆時才是堆heap.

棧是先入後出的,一般是由高位址向低位址生長。

全域性變數和靜態變數

如果定義乙個全域性變數,未被初始化,則變數被預設初始化,但區域性變數未被初始化,則該值未定義。內建型別和陣列一樣 定義全域性靜態變數 在全域性變數前加個關鍵字static,該全域性變數變為全域性靜態變數。全域性靜態變數有以下特點 1 在全域性資料區內分配記憶體 2 如果沒有初始化,其預設值為0 3 ...

全域性變數和靜態變數區別

儲存的地方是一樣的,不同之處在於它們的作用域不同 全域性變數基本上在程式的任何地方都能被看到 而靜態區域性變數只能在其指定的範圍內被使用 比如 int i 全域性變數 class c void main 全域性變數具有外部連線性,即同一工程中其它檔案中的也可引用。而靜態變數不具有外部連線性,即同一工...

全域性變數和靜態全域性變數

全域性變數和區域性變數是從變數的作用域的角度劃分。靜態變數和動態變數是從變數的記憶體分配的角度劃分。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同,區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原...