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

2024-01-11

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

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 维,正如这个问题所解释的为什么在传递二维数组作为参数时需要指定列大小? https://stackoverflow.com/questions/12813494/why-do-we-need-to-specify-the-column-size-when-passing-a-2d-array-as-a-parameter,但对于显式初始化的情况,这对我来说不太明显。这只是标准的限制,还是我缺少一个令人信服的技术原因?


原因之一是允许使用如下初始化程序来初始化数组:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在c中初始化n维数组时必须显式指定n-1维 的相关文章

随机推荐