次元数を減らすと少しわかりやすくなります。大胆に、1つの次元を除くすべてを削除し、宣言しましょう
extern double foo[];
これが行うことは、不完全な型、未知の数のdoubleの配列を宣言することです。明示的な数の要素を指定すると、型は完全になります。違いは、sizeof
不完全な型には適用できないことです。コンパイラは、それらが不完全であるため、それらのサイズを知ることができません。
ここで、配列の配列を宣言する場合、両方の次元を不明にすることはできません(のようにdouble foo[][]
)。何故ですか?以前は、コンパイラはfoo[42]
doubleのサイズを知っているため(doubleは完全な型であるため)、の場所を計算できました。計算するfoo[1][42]
には、要素タイプのサイズを知っている必要があります。つまり、要素タイプは完全である必要があります。Cでは、右端の次元が最も速く変化するため、ここでの要素タイプは、左端の次元を除くすべてによって与えられdouble [42]
ます。元の質問では、ですdouble [2][9][11]
。
配列全体のサイズが必要ない場合は、1日の終わりに、左端の次元を空白のままにすることができます。