我正在执行以下操作以在 C++ 中初始化数组
int a;
cin>>a;
float b[a];
这可以在我的计算机中运行和编译。这个对吗?我认为只有当 a 是 const int 时我们才能这样做。
我正在执行以下操作以在 C++ 中初始化数组
int a;
cin>>a;
float b[a];
这可以在我的计算机中运行和编译。这个对吗?我认为只有当 a 是 const int 时我们才能这样做。
这与 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
的容器要好得多,并且具有更多的可扩展性和适应性。
有关为什么可变长度数组不是 C++ 标准的一部分的更多讨论,请参阅帖子?
取决于你对“正确”的定义。
这被称为可变长度数组(或只是VLA),并且在当前版本的 C++ 中不受官方支持(C++03 及之前版本为 100%,C++11 为 99.99%),但它在 C 中.
一些编译器允许将其作为编译器扩展。