變數的自動初始化

2022-05-03 03:03:10 字數 1455 閱讀 2903

**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

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};

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 不會有對應的執行指令 定義是分配空間,而初始化...