看下面的一段代碼:
int statusArr[100] = {1}
能達到全都初始化為1的結果么?
結果是只有第一個元素初始化了為1,其他都是0.
之前經常寫
int a[100]= {0}
這么寫可以,為什么?
因為c++有個基本的語法規則,數組初始化列表中的元素個數小於指定的數組長度時,不足的元素補以默認值。當我們寫0沒有問題因為恰好0是int的默認值罷了。
string a[5] = { "foo", "", "", "", "" };
即后面4個元素調用了string的默認構造函數進行的初始化,而第一個則調用的string::string(const char*)進行的初始化。
還有一個區別:
int a[5];
string a[5];
如果不明確指出初始化列表,那么基本類型是不會被初始化的(除全局變量和靜態變量外),所有的內存都是“臟的”;而類類型則會為每個元素調用默認構造函數進行初始化。
注意,在C++11中中間的賦值號可以省略,即 int a[5]{1}; 並且,如果初始化列表為空,如 int a[5]{};,那將初始化所有元素為默認值,即與 int a[5]{0}; 等價
所以當你想在c++對數組賦初值時用正規方法memset.另外注意memset函數原型雖然是:
但是memset只會取int ch的后8位,也就是一個byte.
錯過了初始化時機(memset的誤區)
如果想在數組創建結束后再對其進行初始化,可以使用C函數memset(),但是memset的使用有個大問題,就是它只對char類型的數組管用:
char a[10];
memset(a, 1, 10); // 將每個元素設置為1
如果將上面的a數組換成int或其他類型的,就會出現問題,因為memset的內部實現是以字節為單位進行賦值的,int 類型大於一個字節(假設是4個),數組內存連續,如果有下面代碼:
int a[10];
memset(a, 1, sizeof(a));
將只會對前sizeof(a)即40個字節進行賦值1的操作,即給“前5個int”進行了賦值0x01010101的操作,失之毫厘謬以千里!