2013-12-20 301 views
2

我做的在C初始化数组++初始化数组

int a; 
cin>>a; 
float b[a]; 

这工作,在我的计算机编译如下。它是否正确?我认为如果a是一个const int,我们只能做到这一点。

+0

这是一个编译器扩展后更多的讨论,虽然它是在一个TS即将到来。使用'-pedantic(-errors)'。 – chris

+0

@chris请你详细说明,因为我是新手,并且不理解你的回复。我可以继续使用这种初始化进行编码吗? – Karthik

+2

答案详细阐述了大部分内容。假设你使用的是GCC或Clang,你可以使用'-pedantic'来编译以获得警告,并且在2014年技术规范中,VLA将使用C++。 – chris

回答

1

取决于你的“正确”的定义。

这就是所谓的变长数组(或只是VLA),它不是正式的C++的当前版本支持(100%确定为C++ 03之前,99.99%,确保了C++ 11),但它在C.

有些编译器允许将它作为编译器扩展。

+0

0.01%在哪里? – texasbruce

+0

@texasbruce - :)我还没有读新的标准。 _然而_。 :) –

1

这不是关于a是否是一个常量int。这是关于a是否具有在指定时间分配的初始值。编译器需要根据const int值分配存储空间。 C++标准现在不支持可变长度数组。

在C99中,可变长度数组的这种语法是有效的,但C++标准说不。这是一个非常有用的功能,让所有毛茸茸的内存分配给编译器。

在GCC和Clang中,此功能作为编译器扩展支持,因此您不会收到任何警告和错误。但MSVC编译器会提示一条错误消息,说cannot allocate an array of constant size 0,所以它是编译器特定的。

支持此功能的编译器可能已将您的代码转换为new运算符。

int a; 
cin>>a; 
float *b = new float[a]; 

这在C++标准中有效。

另一件事是,虽然它被称为可变长度数组,但它根本不是长度可变的。一旦定义,其长度是一个永不改变的常数值。您无法展开或缩小它。

使用vector容器真的好得多,它的确是长度变量,并且具有更多的可扩展性和自适应性。

查看Why aren't variable-length arrays part of the C++ standard?