我正在执行以下操作来初始化c ++中的数组
int a;
cin>>a;
float b[a];
这可以在我的电脑中编译和编译。它是否正确?我认为如果a是一个const int我们只能这样做。
答案 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?
的更多讨论,请参阅帖子