为什么我不能创建一个大小为n的数组?

时间:2011-03-20 12:39:51

标签: c++ arrays memory

  

可能重复:
  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 []运算符。

所以我的问题在这里:

  • 为什么C ++不允许在堆栈内存中创建动态长度数组?

5 个答案:

答案 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(具有此功能的设计)的使用。