具有非常量变量大小的编译时数组初始化

Posted

技术标签:

【中文标题】具有非常量变量大小的编译时数组初始化【英文标题】:compile-time array initialization with non-const variable size 【发布时间】:2016-03-15 16:22:09 【问题描述】:

我对数组初始化的幕后发生了什么感到困惑。

int n= 3;
int a[n]; // compile succeeds

但是,

int n = 3;
int a[n] = 1, 2, 3;   // compile error

来自代码块的错误消息:

error: variable-sized object 'a' may not be initialized

我的理解是: 第一个 sn-p,n 个元素已分配但未初始化。第二个分配n个元素并将它们初始化为1, 2, 3。两者都做几乎相同的事情,但为什么第二个会导致错误。


请澄清我的理解或给我一些资源(我已经尝试过,但找不到接近的答案)。


编译器:mingw32-g++

【问题讨论】:

错误是什么?你用的是什么编译器? int a[n]; 不是标准的,不应编译。 VLA 不是标准的,尽管 GCC 默默支持它们 【参考方案1】:

在 C99 中,标准明确禁止 (6.7.8p3)

要初始化的实体的类型应该是一个未知大小的数组或者一个不是变长数组类型的对象类型。

尽管我们可以看到n 是一个常量值,但它并没有被标记为这样。

AFAIK,C++ 标准不允许可变长度数组(即 n 不是 constconstexpr)尽管大多数编译器都支持它遵循 C 规则。

【讨论】:

以上是关于具有非常量变量大小的编译时数组初始化的主要内容,如果未能解决你的问题,请参考以下文章

C 语言数组 ( 数组本质 | 数组长度定义 | 数组初始化 | 编译时初始化 | 显式初始化 - 重置内存 )

C语言数组寻址

C++声明一个基于非常量变量的数组?

动态初始化的数组大小示例

初始化 C/C++ 多维数组时忽略大小

返回变量结构成员