生命週期
作用域預設值
記憶體區域
鏈結屬性
全域性變數(定義在函式外部的變數)
普通全域性變數
程式執行開始建立,程式退出才銷毀
從定義變數處到本檔案結尾都能使用
0全域性變數區外部(
其他檔案也能用)
靜態全域性變數
程式執行開始建立,程式退出才銷毀
從定義變數處到本檔案結尾都能使用
0全域性變數區內部(
只能本檔案使用)
區域性變數
(定義在函式內部的變數,包括形參)
普通區域性變數
進入函式建立,退出函式銷毀
函式內部或for迴圈內部等等
隨機值區域性變數區
靜態區域性變數(不常用)
第一次執行該語句建立,程式結束才銷毀
函式內部或for迴圈內部等等
0全域性變數區
動態記憶體
呼叫malloc()建立,free()銷毀
隨機值堆
函式普通函式(外部函式)
**段外部
(外部檔案引用)
靜態函式(內部函式)
**段內部
(內部檔案引用)
記憶體塊**段全域性變數區棧堆
(上圖並無邏輯關聯)
1.全域性變數:定義在函式外部的變數,如:
int g_a ; // 普通全域性變數
static int g_sa; //靜態全域性變數
兩者之間的區別在於鏈結屬性(static修飾的是鏈結屬性).
1_1:普通全域性變數:可以被外部檔案使用。當已經在同乙個解決方案中的檔案2中定義了普通全域性變數(int g_a ;),麼在檔案1中可以通過(extern int g_a;)來引用它。
1_2:靜態全域性變數:只能被本檔案使用。當在檔案1中定義了靜態全域性變數(static int g_sa;)時,有在本檔案中可以引用該變數,而在檔案2中並不能通過(extern int g_sa;)來引用靜態全域性變數。
2.區域性變數:定義在函式內部的變數,包括形參。如:
void fun()
void fun2 ()
int main()
}2_1:普通區域性變數:生命周期短,進入函式時建立、退出函式即銷毀。作用域僅僅是在函式內部,存放在棧裡,且初始值(未初始化)為隨機值。在上述的程式當中,結果為輸出十次的1.
2_2:靜態區域性變數:生命週期長,第一次執行語句時建立,程式結束時銷毀。且作用域與區域性變數相同,存放在全域性(靜態)變數區,且初始值為0。在上述的程式當中,結果為輸出1~10.
3.動態記憶體:呼叫malloc()(還有calloc()和realloc())時建立,free()銷毀.存放在堆中,且初始值為隨機值。
4_1:普通函式(外部函式):能夠被外部檔案引用。存放在**段裡,一般都寫在.h檔案裡,可供外部檔案使用。
全域性變數 靜態全域性變數 靜態區域性變數 區域性變數
全域性和靜態變數都在堆裡。這句話應該錯了,應該是放在常量資料段 全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用...
全域性變數 靜態全域性變數 靜態區域性變數 區域性變數
全域性和靜態變數都在堆裡。全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用在定義它的那個檔案裡,卻不能用在程式中...
全域性變數 靜態全域性變數區域性變數 靜態區域性變數
對於乙個完整的程式,在記憶體中的分布情況如下圖 區 low address 全域性資料區 堆區 棧區 high address 一般程式把新產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料 即使是函式內部的靜態區域性變數 也存放在全域性資料區。...