2013-10-10 98 views
3

我知道可以明確地初始化一個1-d陣列如下initiailizing n維陣列時,尺寸來顯式地指定:爲什麼必須N-1在C

int a1d[] = {0, 1, 2, 3, 4, 5}; 

此陣列將具有完全相同6元素 - sizeof(a1d)/sizeof(a1d[0])告訴我。

我試圖用2-(或更多)維數組做到這一點:

int a2d[][] = {{0, 1, 2}, {3, 4, 5}}; 

但是GCC錯誤與error: array type has incomplete element type。 這似乎是從初始化明確,這是一個2x3數組,但它似乎這是不允許的 - 這是爲什麼?

相反,我必須指定所有,但一個維度:

int a2d[][3] = {{0, 1, 2}, {3, 4, 5}}; 

我明白,如果我要一個n維數組傳遞給一個函數,那麼它是絕對必要的n-1個尺寸在該函數中指定,如Why do we need to specify the column size when passing a 2D array as a parameter?這個問題所解釋的那樣,但對於我明顯初始化的情況來說,它不那麼明顯。這只是標準的限制,還是有一個令人信服的技術原因,我失蹤了?

+0

這樣編譯器就可以確定如何佈局內存中的非鋸齒形數組。 –

+0

@MitchWheat - 但從初始化不明顯嗎?還是編譯器不夠聰明來解決這個問題? –

+0

@MitchWheat - 你能在這裏精確地展開你的意思嗎? –

回答

3

的一個原因是,它是可允許的,像這樣的初始化初始化數組:

= { { 1 }, { 2, 3 }, { 4, 5, 6 } }; 

這不是強制性的,以提供每一個初始化。事實上,與指定的初始化,這可能會成爲:

= { [23] = { 1 }, [9] = { 2, 3 }, [3] = { [13] = 4, [99] = 5, [0] = 6 } }; 

所以數組是一個初始化用於必須至少有:

int a[24][100]; 

晴,它的歷史可以追溯到C時的古代歷史編譯器必須適合64 KiB內存等。編譯器推導出數組大小所需的額外工作對於機器的容量來說可能太大了(尤其是與讓用戶明確指定有多大的成本相比他們想要的數組 - 保存的輸入是最小的)。

注意:'允許'並不意味着'推薦'。

+0

此外,在尺寸未知的情況下處理初始化器需要一個複雜的數據結構來記住它們,或者如果發現其中一個列表包含的元素多於之前用於該維度的元素,則重新排列編譯器中之前處理過的元素內存以適應新的尺寸。相比之下,當只有最外層的維度是不確定的時候,最需要的是更多內存的「realloc」。 –