初始化数组

时间:2013-12-20 14:08:18

标签: c++ arrays initializing

我正在执行以下操作来初始化c ++中的数组

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

这可以在我的电脑中编译和编译。它是否正确?我认为如果a是一个const int我们只能这样做。

2 个答案:

答案 0 :(得分:1)

取决于您对“正确”的定义。

这称为可变长度数组(或只是 VLA ),并且在当前版本的C ++中没有正式支持(C ++ 03和100%肯定)之前,C ++ 11确保99.99%,但它在C中。

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

答案 1 :(得分:1)

这不是关于a是否是常数int。它是关于a是否具有在comipling时间分配的初始值。编译器需要根据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?

的更多讨论,请参阅帖子