可能重复:
Why can't I create an array with size determined by a global variable?
这是具有常量大小4的简单数组的定义,它存储在堆栈存储器中:
int array[4];
现在如果我想在堆栈中声明动态大小的数组,我似乎应该编写这段代码:
int n;
cin >> n;
int array[n];
但是我们知道这在C ++中是不允许的,而是我们可以编写这个,它将在动态内存(即堆)中创建数组:
int n;
cin >> n;
int *array = new int[n];
但这更慢并且(因为使用了new运算符)并且需要在我们完成数组工作后调用delete []运算符。
所以我的问题在这里:
答案 0 :(得分:8)
int n;
cin >> n;
int array[n];
如果使用g ++,这将有效。 g ++支持VLA作为扩展。但是,ISO C ++要求将数组的大小设置为常量表达式,即在编译时必须知道大小。
为什么C ++不允许在堆栈内存中创建动态长度数组?
简单回答“因为标准是这样说的”。即使即将推出的C ++标准(C ++ 0x)也不允许使用可变长度数组。
BTW我们在C ++中总是有std::vector
。所以没有理由担心。 :)
答案 1 :(得分:3)
C99允许可变长度数组(VLA); C89没有。
void function(int n)
{
int array[n];
...
}
C ++(98,03)不允许VAs以与C99相同的方式,但它具有在许多方面更好的向量和相关类型。
答案 2 :(得分:2)
int n;
cin >> n;
int array[n];
在C ++中,必须在编译时知道数组的大小。但是在您的代码中,大小将在运行时知道。语言不允许这样做!
答案 3 :(得分:1)
没有一种叫做C / C ++的语言。有C,它允许自1999年以来的可变长度数组(VLA),并且有C ++,它不允许。
回答你的问题“为什么” - 无论出于何种原因,C ++标准体都没有将VLA纳入C ++标准。
答案 4 :(得分:-1)
除了其他答案:
我的猜测是,C ++标准板认为C风格的数组已过时且evil,并且通过这种方式促进了std::vector
(具有此功能的设计)的使用。