#include<iostream>
using namespace std;
main()
{
int m;
cin>>m;
int re[m];
cout<<sizeof(re);
}
此代码在 codeforces GNU C++ 4.7 中完美运行(但不在我的 Microsoft Visual C++ 中)。但为什么?数组大小不应该是一个常数吗?
正如您所提到的,C++ 数组大小必须是常量表达式。
- 使用 VS,您将获得: error C2057: expected constant expression
- GCC 有一个标准扩展,它允许您的代码编译。
C99 中引入了可变长度数组。标准 C++ 不支持它,但 GCC 支持它作为扩展:
有关详细信息,请参阅GCC 扩展:可变长度数组。
对于堆栈分配,需要在编译时确定数组大小。但是数组大小是在运行时确定的,所以它必须在堆上。
利用
int *re = new int[m];
cout << m << endl;
delete[] re;
正如其他人已经提到的,您的代码是非标准 C++,因为您有一个可变长度数组:
int m;
cin>>m;
int re[m]; // m is not a compile time constant!
GCC 允许这作为语言扩展。如果启用,您会收到警告-Wvla
。Afaik,如果您强制 gcc 使用特定的 c++ 标准,例如 aus ,此代码将被拒绝-std=c++11
。
现在你可以这样做(正如 Paul Draper 已经写的那样)
int *re = new int[m]; // dynamic array allocation
delete[] re; // giving the memory back to the operating system
但是,C++ 为此提供了一个易于使用的包装器:
std::vector<int> re(m);
在大多数情况下,vector 的行为就像一个动态分配的数组,但可以防止您意外忘记 todelete
或 double delete
,并使将数据传递给函数更容易一些。在cppreference.com上了解有关矢量的更多信息。