2011-09-15 4 views
9

2010のVisual Studioでは、この初期化が期待どおりに動作:なぜ多次元配列を初期化するときに次元を省略できないのですか?

char table[2][2] = { 
         {'a', 'b'}, 
         {'c', 'd'} 
        }; 

しかし、のようなものを書くことが法的いないようです:

char table[][] = { 
        {'a', 'b'}, 
        {'c', 'd'} 
       }; 

Visual Studioは、この配列は "の要素を含んでいない可能性があることを訴えますコンパイル後、VSは2つのエラーを報告します:インデックスが見つからず、初期化が多すぎます。

質問:なぜ多次元配列を初期化するときに寸法を省略できないのですか?

答えて

12

最も内側の次元のみを省略できます。配列の要素のサイズは、配列変数に与えられた型に対して導かれます。したがって、要素のタイプは既知のサイズでなければなりません。

  • char a[];要素(例えばa[0])サイズ 1の(8ビット)を有し、そして未知のサイズを有しています。
  • char a[6];要素サイズ 1のを有し、サイズ6
  • char a[][6];は(配列である例えばa[0]、)素子サイズ 6のを有しており、未知の大きさを有しています。
  • char a[10][6];要素サイズの 6を持っており、サイズ60

許可されていません:

  • char a[10][];は、10個の要素未知のサイズのを持っているでしょう。
  • char a[][];は、未知の数の未知数を有するであろう。

要素のサイズは必須です。コンパイラは要素にアクセスするためにポインタ演算を使用する必要があります。

+6

つまり、配列自体のサイズは不明な場合がありますが、要素のサイズは不明ではありませんか? –

+0

@Miroslav:まったく! –

+0

ああ、この情報のおかげで、ありがとう。さらに考えてみると、それは常にそうであるように論理的にしか見えないのですか? ;-) –

0

これは受け入れ可能な回避策ですか?

char * table [] = { "ab", "cd" }; 

EDIT:各文字列の末尾に余分な '\ 0'が追加されることに注意してください。

+0

これは素晴らしい解決策です。しかし、私が探していた答えではありません。それでも、クールなトリックを私に見せてくれてありがとう。 :-) –