#include<iostream>
using namespace std;
main()
{
int m;
cin>>m;
int re[m];
cout<<sizeof(re);
}
此代码在代码GNU C ++ 4.7中运行完美(但不在我的Microsoft Visual C ++中)。但为什么? 不应该将数组大小设为常数吗?
答案 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上的向量。