2016-10-12 35 views
0

我沒有幫助地看着這個SO post二維陣列,兩個邊界都沒有指定

int main() 
{ 
    int a[][] = {{1,2},{3,4}}; 
} 

錯誤

$ gcc a.c                  
a.c:6:8: error: array has incomplete element type 'int []' 
    int a[][] = {{1,2},{3,4}}; 
    ^
1 error generated. 

爲什麼a[][]不完整的類型?

爲什麼int a[][2]很好?

我會假設,因爲編譯器可以初始化這個二維數組,它也可以自動計算出邊界?我知道我需要提供尺寸,但爲什麼?這是語言要求嗎?

+0

是不是二維數組第二個字段必須聲明,即使第一個isnt? –

回答

1

這裏的問題:

6.2.5類型
...
一種 陣列型描述了一種連續地分配非空集合與特定的成員對象類型的對象,稱爲 元件鍵入無論何時指定陣列類型,元素類型應該是完整的。數組類型的特徵是它們的元素類型和數組中元素的數量。據說陣列類型是從其元素類型派生而來的,並且如果其元素類型是 T,則陣列類型有時稱爲''數組 T''。從元素類型構造數組類型被稱爲''數組類型派生''。

二維數組實際上是一維數組,其中每個元素都有數組類型。你可以認爲該聲明

T a[][N]; 

的爲已經寫入

typedef T R[N]; 
R a[]; 

根據上面的規則,R必須是一個完整的類型;這意味着如果R是一個數組類型,它的大小必須是已知的。你可以不寫

typedef T R[]; 
R a[]; 

這意味着你不能寫

T a[][]; 

這是不論任何初始化的存在。

2

只有一個索引可以自動大小。否則,你可能有任何一對因素的大小。所以a[][2]的作品,但a[][]沒有,因爲它不能猜測陣列數組的大小。

+1

好吧,在這種情況下,它可以從初始化程序中算出數組的大小。只是語言規範恰好說它不應該那樣做。 –

+0

在這種情況下,是的,但在大多數情況下沒有。嘗試六個要素。是[2] [3]還是[3] [2]? – MarcD

+3

如果他們像OP一樣支撐着,就沒有歧義 –