4

我知道我可以显式初始化一维数组,如下所示:

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

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

我正在尝试使用二维(或更多)维数组来做到这一点:

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

但是 gcc 错误error: array type has incomplete element type。从初始化中可以看出这是一个 2x3 数组,但似乎这是不允许的 - 为什么会这样?

相反,我必须指定除一个维度之外的所有维度:

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

我知道如果我要将n维数组传递给函数,那么在函数中指定n-1维是绝对必要的,正如这个问题解释的那样,为什么我们需要指定列大小时将二维数组作为参数传递?,但对于显式初始化的情况对我来说不太明显。这只是标准的限制,还是我缺少令人信服的技术原因?

4

1 回答 1

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 内存等。编译器推断数组大小所需的额外工作可能对于机器的容量来说太大了(尤其是与让用户明确指定他们想要多大的数组的成本相比——节省的输入是最小的)。

注意:“允许”并不意味着“推荐”。

于 2013-10-10T00:40:56.497 回答