c++數組初始化誤區


看下面的一段代碼:

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函數原型雖然是:

void *memset(void *s, int ch, size_t n);

 

但是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的操作,失之毫厘謬以千里! 

打賞

免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2022 CODEPRJ.COM