重要 C C 變數的自動初始化

2022-06-28 23:36:16 字數 1821 閱讀 7683

**1:

#include#define const 100

int *p1;

int a[2

];int

b;static

intc;

main()

按 ctrl+c 複製**

輸出:const=100

a[0]=0

b=0c=0

d=2514932

e=0f[0]=1307813

*p2=457819009

資料區存放已初始化的全域性變數,靜態變數(包括全域性和區域性的),常量。

未初始化資料區(uninitializeddata segment,bss)存放全域性未初始化的變數。bss的資料在程式開始執行之前被初始化為0或null。bss段的變數在目標檔案中只佔乙個符號位,編譯器並沒有給變數分配空間,所謂的「初始化為0」是指要鏈結階段才申請了空間,並隨即初始化為0。而已初始化的全域性變數要占用目標檔案的大小。

換句話說全域性變數,靜態變數(包括全域性和區域性的),常量未顯式初始化被預設地初始化時0或null。故列印*p1出錯,因為p1指向null位址。

如果試圖列印*p1則會發生段錯誤,因為p1指向的是乙個null位址

區域性的非靜態變數未顯式初始化時是乙個隨機的數,一般是個很大的數

不論是在全域性還是區域性作用域,類型別變數都會呼叫「預設建構函式」進行初始化。

所謂「預設建構函式」就是指空引數的建構函式。

**2:

classa};

a a1;

intmain()

輸出:intitialize a

intitialize a33

如果類沒有顯式地定義任何建構函式,則編譯器會自動為其生成空引數的建構函式,稱為「合成預設建構函式」。「合成預設建構函式」初始化成員的規則有3條:

1.物件在全域性作用域或為靜態區域性物件時,則類的內建成員變數被初始化為0.

2.物件在區域性作用域定義時,則類的內建成員變數不被初始化為0.

**3:

class

a;a a1;

intmain()

輸出:0

2510836

03.對於類型別成員按照其自身的(合成)預設建構函式進行初始化。——重要

**4:

classa};

class

b;b b1;

intmain()

輸出:0     5

134514784     5

**5:

class

a;class

b;b b1;

intmain()

輸出:0   0

134514736   -1081710584

如果類顯式提供了帶引數的建構函式,則編譯器不會再為其生成空引數的建構函式。這時候就不能用空引數來定義類型別變數。下面的**是錯誤的:

classa};

class

b;int

main()

**:4.對於指標成員,如果不在建構函式裡顯式初始化,則自動會有有個位址,非null,故最好把不顯式初始化的指標在建構函式裡賦值為null,避免野指標現象。

注:所以變數盡量做到初始化

變數的自動初始化

變數的初始化分為倆種型別 1.內建型別自動初始化。程式中有乙個資料區,存放已初始化的全域性變數,靜態變數和常量,所以會增加目標檔案的大小。還有乙個未初始化資料區bss 存放未初始化全域性變數,但是在程式開始執行之前,這些資料會被初始化為0或者null。所以bss資料在目標檔案中只佔乙個符號位,編譯器...

變數的自動初始化

1 1 include2 define const 100 3int p1 4int a 2 5 intb 6static intc 7main 8 輸出 const 100 a 0 0 b 0c 0 d 2514932 e 0f 0 1307813 p2 457819009 資料區存放已初始化的全...

C C 成員變數的初始化順序

變數的初始化順序 基類的靜態變數或全域性變數 派生類的靜態變數或全域性變數 基類的成員變數 派生類的成員變數 注意 成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。如果不使用初始化列表初始化,在建構函式內初始化時,此時與成員變數在建構函式中的位置有...