这个C ++代码是如何在GCC中运行而不是在Visual C ++中运行的?

时间:2013-11-03 06:12:25

标签: c++ arrays gcc

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

有关详细信息,请参阅GCC extension: Arrays of Variable Length

答案 2 :(得分:3)

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

使用

int *re = new int[m];
cout << m << endl;
delete[] re;

答案 3 :(得分:1)

正如其他人已经提到的,你的代码是非标准的C ++,因为你有一个可变长度数组

  int m;
  cin>>m;
  int re[m]; // m is not a compile time constant!

GCC允许将其作为语言扩展。如果您启用-Wvla,则会收到警告。 Afaik,如果你想让gcc使用特定的c ++标准,例如-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的行为就像动态分配的数组一样,但可以防止您意外忘记delete或双delete并使数据更容易传递给函数。详细了解cppreference.com上的向量。