为什么必须在c中初始化n维数组时明确指定n-1维度

时间:2013-10-10 00:24:27

标签: c arrays initialization

我知道我可以按如下方式显式初始化一维数组:

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

这个数组将有6个元素 - sizeof(a1d) / sizeof(a1d[0])告诉我。

我正在尝试使用2(或更多)维数组:

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

但是error: array type has incomplete element type的gcc错误。 从初始化看它是明确的,这是一个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?所解释的那样,但是对于明确初始化的案例,我不那么明显。这仅仅是标准的限制,还是有一个引人注目的技术原因我不知道?

1 个答案:

答案 0 :(得分: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内存等时。编译器推断出数组大小所需的额外工作可能对于容量而言太大了。机器(特别是与用户明确指定他们想要的阵列大小的成本相比 - 保存的打字很少)。

注意:'允许'并不代表'推荐'。