2016-10-12 9 views
0

私はこれを助けなしでSO postに見ました。両方の境界が指定されていない2次元配列

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]は良いですか?

コンパイラはこの2次元配列を初期化することができるので、自動的に境界を見つけることができると私は考えていましたか?私はサイズを提供する必要があることを知っているが、なぜですか?それは言語の要件ですか?

+0

2番目のフィールドが2番目のフィールドでない場合でも、宣言する必要はありませんか? –

答えて

1

ここで問題です:、

6.2.5タイプ
...
配列型は、特定のメンバーオブジェクトタイプとオブジェクトの連続割り当てられた空でない集合を記述する 要素と呼ばれますタイプと入力します。 要素タイプは、配列タイプがと指定されるたびに完了しなければなりません。配列型は、その要素型と配列の要素数によって特徴付けられます。配列型はその要素型から派生したものであり、その要素型が Tの場合、配列型は「配列 T」と呼ばれることがあります。要素型からの配列型の構築は、「配列型導出」と呼ばれます。

2D配列は、実際には各要素が配列型の1D配列です。あなたは上記のルールパー

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

Rは完全な型でなければなりません書かれたものとして宣言

T a[][N]; 

と考えることができます。つまり、Rが配列タイプの場合、そのサイズを知る必要があります。あなたは

T a[][]; 

これは関係なく、任意の初期化子が存在するのです書くことはできません意味

typedef T R[]; 
R a[]; 

を書くことができませんでした。

2

インデックスは1つだけ自動サイズ設定できます。さもなければ、サイズの要素の任意のペアを持つことができます。したがってa[][2]が動作しますが、配列の配列のサイズを推測できないため、a[][]はありません。

+1

この場合、イニシャライザから配列のサイズを計算することができます。言語仕様だけでは、そうしてはならないと言われています。 –

+0

この場合、はいですが、ほとんどの場合はいいえです。 6つの要素を試してください。それは[2] [3]か[3] [2]ですか? – MarcD

+3

OPのようにブレースされている場合は、あいまいさはありません –

関連する問題