2016-04-30 66 views
1

要初始化一個二維數組,通常我們可以做到這一點是這樣的:意外的初始化結果

int matrix[3][4] = { {1,1,1,1}, {2,2,2,2}, {3,3,3,3} }; 

然而,正如我與不同的組合測試它,下面的代碼並編譯出乎我的意料:

int matrix[3][4] = {1,2,3,4,5,6,7}; 

當我打印出來的輸出在二維表的形式,我得到:

1,2,3,4, 
5,6,7,0, 
0,0,0,0, 

我明白爲什麼其餘的值是零。

我的問題是:這是一種合法的方式來初始化二維數組,通過假設數字超過行的邊界將永遠「流」到下一行?或者這是我應該避免在C++中的另一個陷阱?

+1

這是完全合法的。自從標準化之前,它一直是C和C++的一部分。儘管您可能認爲更明確的版本更易於閱讀。 –

+0

@AlanStokes感謝您的回覆,當我知道它是合法的時候,我有點驚訝,因爲我認爲它確實編譯了,因爲C++沒有檢查邊界,並且數字只是坐在下一個可用內存中。或者我可以這樣說,因爲下一個可用內存也是「保留」的數組的一部分。這樣做很好嗎? – user3437460

+1

@ user3437460如果不檢查邊界,編譯器如何將其中的任何值設置爲0?如果超出邊界,將導致編譯器錯誤。 – user6276096

回答

6

是的,這非常好。引述the unofficial cppreference

撐杆圍繞嵌套初始化列表可被消隱 (略),在該必要的情況下儘可能多的初始化子句 用於初始化對應 子聚集的每個部件或元件,並且後續的初始化子句用於 初始化該對象的以下成員。

和:

如果初始化子句的數目小於 成員或初始化列表的數目是完全空的,其餘成員 由空列表初始化,其執行值初始化。

初始值爲int的值將其設置爲0