函式 全域性變數 區域性變數和動態記憶體的特點歸納

2021-08-06 07:58:37 字數 1402 閱讀 8034

生命週期

作用域預設值

記憶體區域

鏈結屬性

全域性變數(定義在函式外部的變數)

普通全域性變數

程式執行開始建立,程式退出才銷毀

從定義變數處到本檔案結尾都能使用

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 一般程式把新產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料 即使是函式內部的靜態區域性變數 也存放在全域性資料區。...