各型別變數的自動初始化總結

2021-05-28 13:45:38 字數 1009 閱讀 3626

前幾天給系統寫乙個新功能,被初始化問題搞毛了:乙個結構體裡包含列舉型別的變數,結果由於沒有初始化,搞了一堆隨機數……。這個結構體是作為輸入引數放在查詢函式裡的,結果自然查不到。最悲劇的是,在我的windows平台可以成功查到,linux平台有一定機率能查到……

如果乙個變數沒有進行初始化,那麼使用它的行為是未定義的行為,這種行為有時正確有時錯誤,這就是我寫的程式結果不確定的原因了。所以,一定不能依賴未定義的行為。

吸取教訓,以後要記得盡量初始化,特別是對於內建型別與列舉型別!但是,很多態別的變數在定義時是有預設值的。所以為了以後方便,還是整理一下。

首先列出當變數自動初始化時,每個型別對應的預設值:

變數(物件)型別

預設值布林和所有整型

所有小數

0.0char

string

列舉型別

第乙個列舉成員

其他類型別或結構體

預設建構函式

另外,指標和引用型別的變數是不會自動初始化的,因為它沒有乙個預設值!當定義乙個指標物件時,如int *pi; 此時它並未初始化,使用它很危險。應該在定義時直接初始化為它指向的物件。如果必須分開定義該指標和物件,要將指標初始化為0(null)。

如果是類型別的,只要定義了預設建構函式,在沒有顯式初始化時就會進行自動初始化。但是,對於內建和列舉型別的變數,並不是總會自動初始化。他們在什麼時候不進行自動初始化從而造成悲劇呢?

函式體內定義時、動態陣列建立時。

當物件是乙個類型別或結構體時,它資料成員的初始化與任何變數初始化規則相同。所以如果類裡面有內建型別或者復合型別的資料成員,則一定要在建構函式裡對其進行顯式的初始化

歸根結底,內建型別和復合型別的變數自動初始化的情況並不經常出現,所以最好的方法還是按照c++ primer的建議:每個內建型別的物件都要初始化!由於復合型別和內建型別自動初始化規則是一樣的,所以我再加一句,每個復合型別的物件也都要初始化!而類型別的只要有預設建構函式就行了。所以說還是物件好啊。

變數的自動初始化

變數的初始化分為倆種型別 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 資料區存放已初始化的全...

幾種變數型別及其自動初始化

以外部定義形式定義的變數稱為外部變數 又名全域性變數 與函式類似,外部變數也允許先使用後宣告,或在另乙個原始檔裡定義而在其他檔案裡被使用。如果需要宣告乙個外部變數,要按照以下形式 extern int a int可以是別的型別這說明a在其他地方被定義 當然需要a真正的有被定義 e.g.在函式內寫 s...