2
#include<iostream>
using namespace std;
main()
{
  int m;
  cin>>m;
  int re[m];
  cout<<sizeof(re);
} 

此代码在 codeforces GNU C++ 4.7 中完美运行(但不在我的 Microsoft Visual C++ 中)。但为什么?数组大小不应该是一个常数吗?

4

4 回答 4

5

正如您所提到的,C++ 数组大小必须是常量表达式。
- 使用 VS,您将获得: error C2057: expected constant expression
- GCC 有一个标准扩展,它允许您的代码编译。

于 2013-11-03T06:15:17.007 回答
4

C99 中引入了可变长度数组。标准 C++ 不支持它,但 GCC 支持它作为扩展:

有关详细信息,请参阅GCC 扩展:可变长度数组

于 2013-11-03T06:18:59.107 回答
3

对于堆栈分配,需要在编译时确定数组大小。但是数组大小是在运行时确定的,所以它必须在堆上。

利用

int *re = new int[m];
cout << m << endl;
delete[] re;
于 2013-11-03T06:14:43.777 回答
1

正如其他人已经提到的,您的代码是非标准 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上了解有关矢量的更多信息。

于 2013-11-03T06:26:07.550 回答