1

我知道int* array = new int [n];在堆中分配内存空间。

但是如果我声明这样的东西:int array[n];在代码块中它编译成功,但是如果我把它移到 Visual Studio,它就会出错。

我想问的是:

  1. 真正做什么int[n]以及它与堆分配相比如何?它们之间有什么区别?

  2. 如果我使用int array[n]而不是,可能会出现什么错误int* array = new int [n];

4

4 回答 4

4

int array[n]在堆栈上声明一个数组,而不是在堆上。在标准 C++n中必须是编译时间常数,但是一些编译器有一个扩展,允许以这种形式声明的可变长度数组没有编译时间常数n。它不是标准的,可能不应该使用。

int array[n]可能会导致几个问题int* array = new int [n];

  • 如果n足够大,您可能会导致堆栈溢出。或者,如果该数组是一个类成员并且您创建了一个该类的大数组。
  • 如果array班级成员搬家可能和复制一样昂贵
  • 如果array是类成员并且您已经给出了指向数组和move类的指针,则指针现在引用移动后的对象,或者如果对象也被破坏,则指向随机内存。不管怎样,不好。
于 2013-03-09T18:20:42.553 回答
3

如果我正确理解你的问题,那么我可以回答这两个问题。

  1. int array[10]分配在栈上,而int *array = new int[10]分配在堆上。通常,堆栈数组仅适用于恒定数量的元素,因此int array[n]在 C90 中是不允许的(只要n不是恒定的)。

  2. MinGW(这是代码块在 Windows 上使用的 GCC 编译器的版本)有一个扩展,它允许您int array[n]在 C90 模式下编写,其中n不是恒定的。Visual C++ 不允许这样做。

于 2013-03-09T18:22:24.383 回答
3

GCC 在 C++ 中有一个扩展,它允许int array[n]wheren不是编译时常量值。在这种情况下,标准语言不允许您使用非常量值n(在 C99 中是允许的)。

于 2013-03-09T18:20:26.437 回答
2

当您编写时int array[n],这意味着您正在执行静态分配。即内存将在编译时分配。所以在这里使用可变长度会导致编译时错误。

于 2013-03-09T18:24:16.297 回答