2

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

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

这可以在我的计算机中运行和编译。这个对吗?我认为只有当 a 是 const int 时我们才能这样做。

4

2 回答 2

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的容器要好得多,并且具有更多的可扩展性和适应性。

有关为什么可变长度数组不是 C++ 标准的一部分的更多讨论,请参阅帖子?

于 2013-12-20T15:43:07.667 回答
1

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

这被称为可变长度数组(或只是VLA),并且在当前版本的 C++ 中不受官方支持(C++03 及之前版本为 100%,C++11 为 99.99%),但它在 C 中.

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

于 2013-12-20T14:10:41.597 回答