正在初始化数组

Initializing an array

本文关键字:数组 初始化      更新时间:2023-10-16

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

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

这在我的电脑中工作和编译。这是正确的吗?我想,只有当a是一个常量时,我们才能做到这一点。

取决于您对"正确"的定义。

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

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

这不是关于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 are';可变长度数组是C++标准的一部分吗?