變數初始化

2021-06-22 07:35:42 字數 1932 閱讀 4484

int a; 

是變數定義,也就是說編譯器將為a分配儲存,這在編譯時被處理。

int a = 0;是定義+初始化,定義的分配儲存的action在編譯時完成,初始化的action則在執行時完成(將執行類似dword 

ptr 

[ebp-4],0的指令,而單獨的int 

a;不會有對應的執行指令)。

定義是分配空間,而初始化是對分配好的空間第一次賦值。定義是在編譯時進行,而初始化需要等到執行的時候才進行。

在c語言裡,全域性變數如果不初始化的話,預設為0,也就是說在全域性空間裡:

int x =0; 跟 int x; 的效果看起來是一樣的。但其實這裡面的差別很大,強烈建議大家所有的全域性變數都要初始化,他們的主要差別如下:

編譯器在編譯的時候針對這兩種情況會產生兩種符號放在目標檔案的符號表中,對於初始化的,叫強

符號,未初始化的,叫弱符號。

聯結器在連線目標檔案的時候,如果遇到兩個重名符號,會有以下處理規則:

1、如果有多個重名的強符號,則報錯。

2、如果有乙個強符號,多個弱符號,則以強符號為準。

3、如果沒有強符號,但有多個重名的弱符號,則任選乙個弱符號。

大部分情況下,我們不希望聯結器為我們做決定,所以我不是很認同後兩個規則,至少應該給個警告,

而不應該安靜地通過。

因為這種問題引起的bug會很難查,

所以我們要盡量把全域性變數初始化,對於不想給別的檔案引用的變數,也盡量用static修飾。

除了連線時的表現不一樣外,未初始化的符號在目標檔案的bss段中,而初始化的符號在data段中。

注:bss段(未手動初始化的資料)並不給該段的資料分配空間,只是記錄資料所需空間的大小。

data段(已手動初始化的資料)則為資料分配空間,資料儲存在目標檔案中。

對於區域性變數,不被初始化的話,其值一般分為兩種情況debug版和release版的區別。

例:

#include "stdafx.h"

int i;

int main(int argc, char* argv)

在debug版下,在這段**中i的值列印出來是0,而j的值列印出來是-858993460,也就是0xcccccccc.

至於為什麼

是這個值,有網友給出這個解釋。(設計成0xcccccccc是有特殊用意的……這個好像叫做

poison,未初始化的

pointer去取值的話會出錯。肯定有人問為什麼不弄成0x00000000,因為空指標是指

針的有效狀態,可能會誤導人,

而0xcccccccc在windows下永遠不可能是乙個指標的有效狀態(不是null,

不指向乙個物件,不指向一堆物件緊接

之後的區域),這就是在模擬野指標……

值得注意的是,同樣的**在release版下,這段**中未被初始化的變數最後列印出來的可能都是0。

也有強大的

網友給出解釋。(重點在於vc的乙個功能:catch release-build errors in debug build用

/gz編譯開關開啟。

debug

版這個開關是開的,release版是關的(為了效率)。這個開關說白了就是把所有

動態區域性變數初始化成0xcccccccc,

把所有動態堆變數初始化成0xcdcdcdcd。很多新手會忘記初始化這些本來應該初始化的變數(尤其是new出來的變數),有時他們會假定這些變數應該是0,這樣就可能出現在release版正常而debug版不正常的程式,因為release版至少區域性

變數的初始值很可能就是0,而有時他們又會假定或者期望這些變數不是0,這樣就帶了乙個最難發現的bug) 

鑑於上面分析,建議大家養成初始化乙個變數的習慣。

初始化列表成員變數的初始化

對於以下程式 include using namespace std class base base b 0 a b int get a int get b int main 本想得到的結果是a,b都為90。但是實際結果卻是 4273046 90process returned 0 0x0 exec...

C 初始化變數

1.初始化變數 int i1 7.2 正確,但是i1的值變為了7 int i 建議使用初始值列表 int i2 錯誤 初始值列表確保不會發生某些可能導致資訊丟失的型別轉換 int i3 錯誤 同上,且 是多餘的 2.使用auto關鍵字 struct record auto p new record ...

變數的初始化

變數可以分為兩種,一種是方法內的區域性變數,另一種是類的成員變數 對於區域性變數,編譯器強制只有在初始化其值得時候才能使用,而成員變數會進行預設初始化。一 區域性變數必須先初始化後使用 public class test 二 成員變數的初始化 所有的成員變數 包括基本型別和類引用 其自動初始化是在剛...