2016-03-15 31 views
0

我对背后的场景的数组初始化有什么困惑。编译时数组初始化与非常量变量的大小

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 

我的理解是: 第一个片段,n个元素被分配但是没有初始化。第二个分配n个元素并将它们初始化为{1, 2, 3}。两者都做几乎相同的事情,但为什么第二个导致错误。


请澄清我的理解或给我留下一些资源(我试过了,但找不到密切的答案)。


编译器:的mingw32-G ++

+0

什么是错误?你使用什么编译器? 'int a [n];'不是标准的,不应该编译。 – NathanOliver

+0

尽管GCC支持它们,但VLA并不标准 – ftynse

回答

1

在C99,它明确地由标准禁止(6.7.8p3)

类型的实体被初始化应的阵列未知大小或不是可变长度数组类型的对象类型。

尽管我们可以看到n是一个常数值,但它并未标记为这样。尽管大多数编译器遵循C规则支持它,但AFAIK,C++标准不允许使用可变长度数组(即n不是constconstexpr),尽管大多数编译器都支持它。