**1:
#include#define const 100int *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:
classa;a a1;
intmain()
輸出:0
2510836
03.對於類型別成員按照其自身的(合成)預設建構函式進行初始化。——重要
**4:
classa};class
b;b b1;
intmain()
輸出:0 5
134514784 5
**5:
classa;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 成員變數的初始化順序
變數的初始化順序 基類的靜態變數或全域性變數 派生類的靜態變數或全域性變數 基類的成員變數 派生類的成員變數 注意 成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。如果不使用初始化列表初始化,在建構函式內初始化時,此時與成員變數在建構函式中的位置有...