动态数组声明的不同方式

dynamic array declaration in different ways

本文关键字:方式 数组 声明 动态      更新时间:2023-10-16

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

但是如果我在代码块中声明这样的东西:int array[n];,它编译成功,但如果我将它移动到visual studio,它会出现错误。

我想问的是:

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

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

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

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

  • 如果n足够大,可能会导致堆栈溢出。或者如果数组是一个类成员,并且创建了一个类的大数组。
  • 如果array是类成员移动可能和复制
  • 一样昂贵
  • 如果array是一个类成员,并且你已经给出了指向数组和move类的指针,那么指针现在指向一个移动后的对象,或者如果对象也被销毁,则指向随机内存。不管怎样,都不好。

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

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

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

  2. MinGW(这是codeblocks在windows上使用的GCC编译器的版本)有一个扩展,允许您在C90模式下编写int array[n],其中n不是常量。Visual c++不允许这个

当您编写int array[n]时,这意味着您正在执行静态分配。也就是说,内存将在编译时分配。因此,在这里使用可变长度将导致编译时错误。