**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
資料區存放已初始化的全域性變數,靜態變數(包括全域性和區域性的),常量。
未初始化資料區(uninitializeddata segment,bss)存放全域性未初始化的變數。bss的資料在程式開始執行之前被初始化為0或null。bss段的變數在目標檔案中只佔乙個符號位,編譯器並沒有給變數分配空間,所謂的「初始化為0」是指要鏈結階段才申請了空間,並隨即初始化為0。而已初始化的全域性變數要在占用目標檔案的大小的。
換句話說全域性變數,靜態變數(包括全域性和區域性的),常量未顯式初始化被預設地初始化時0或null。
如果試圖列印*p1則會發生段錯誤,因為p1指向的是乙個null位址。
而區域性的非靜態變數未顯式初始化時是乙個隨機的數,一般是個很大的數。
不論是在全域性還是區域性作用域,類型別變數都會呼叫「預設建構函式」進行初始化。
所謂「預設建構函式」就是指空引數的建構函式。
**2
classa};a a1;
intmain()
輸出:intitialize a
intitialize a33
如果類沒有顯式地定義任何建構函式,則編譯器會自動為其生成空引數的建構函式,稱為「合成預設建構函式」。「合成預設建構函式」初始化成員的規則有3條:
1.物件在全域性作用域或為靜態區域性物件時,則類的內建成員變數被初始化為0.
2.物件在區域性作用域定義時,則類的內建成員變數不被初始化為。
**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};intmain()
變數的自動初始化
變數的初始化分為倆種型別 1.內建型別自動初始化。程式中有乙個資料區,存放已初始化的全域性變數,靜態變數和常量,所以會增加目標檔案的大小。還有乙個未初始化資料區bss 存放未初始化全域性變數,但是在程式開始執行之前,這些資料會被初始化為0或者null。所以bss資料在目標檔案中只佔乙個符號位,編譯器...
重要 C C 變數的自動初始化
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 資料區存放已初始化...
變數初始化
int a 是變數定義,也就是說編譯器將為a分配儲存,這在編譯時被處理。int a 0 是定義 初始化,定義的分配儲存的action在編譯時完成,初始化的action則在執行時完成 將執行類似dword ptr ebp 4 0的指令,而單獨的int a 不會有對應的執行指令 定義是分配空間,而初始化...