具有未知界限的数组

Array with unknow bound

本文关键字:数组 界限 未知      更新时间:2023-10-16

标准第8.3/4节规定:

当声明符后面跟有初始化器(8.5)。

没关系。以下编译良好:

int a[] = {1};
int main()
{
}

演示

但8.3/4也表示

当多个"数组"规范相邻时创建多维数组;只有常数的第一个可以省略指定数组边界的表达式。

以及以下

int a[][2];
int main()
{
}

不编译

演示

但是,如果我们在声明符后面添加一个初始值设定项:

int a[][1] = {{1}};
int main()
{
}

演示

它运行良好。尽管标准没有指定多维数组的声明符后面必须跟一个初始值设定项。你能解释一下吗?

第一句话中的"also"指的是前面的一句话:

除了允许不完整对象类型的声明外,在某些情况下,函数参数的声明中可能会省略数组绑定(8.3.5)。当声明符后面跟着初始值设定项时,数组绑定也可能被省略

文本没有明确说明,但其意图是,数组绑定不能被省略,除非:(事例列表)

代码int a[][2];不是允许不完整对象类型的声明(例如int a[];也是非法的)。它不在函数参数的声明中;声明符后面也没有初始化器。

因此,此代码不属于允许省略数组绑定的任何列出的情况。


前面的报价:

只有指定数组边界的常量表达式中的第一个可以省略

意味着不能省略第一个边界之后的边界。

您指出

尽管标准没有指定多维数组后面必须有一个初始化器。

这不是真的。多维数组是数组,因此您之前引用的标准中关于省略数组边界的语句也适用于它们(添加了限制)。