我知道int* array = new int [n];
在堆中分配内存空间。
但是如果我在代码块中声明类似的东西:int array[n];
它会成功编译,但如果我将它移动到visual studio,它就会出错。
我想问的是:
int[n]
真正做了什么以及它与堆分配相比如何?他们之间有什么区别?
如果我使用int array[n]
代替int* array = new int [n];
,可能会出现什么错误?
答案 0 :(得分:4)
int array[n]
在堆栈上声明一个数组,而不是堆。在标准C ++中,n
必须是编译时常量,但是有些编译器有一个扩展,允许以这种形式声明的可变长度数组没有编译时常量n
。它不是标准的,可能不应该使用。
int array[n]
会导致int* array = new int [n];
以上的一些问题:
n
足够大,可能导致堆栈溢出。或者,如果数组是类成员,并且您创建了该类的大型数组。array
是班级成员移动可能与复制 array
是一个类成员并且你已经给出了数组和move
类的指针,那么指针现在指的是一个移动后的对象,或者如果对象是随机存储器的话。也被毁了。不管怎样,不好。答案 1 :(得分:3)
GCC在C ++中有一个扩展,它允许int array[n]
,其中n
不是编译时常量值。在这种情况下,标准语言不允许您对n
使用非常量值(在C99中允许)。
答案 2 :(得分:3)
如果我理解你的问题,那么我可以回答这两个问题。
int array[10]
在堆栈上分配,而int *array = new int[10]
在堆上分配。通常,堆栈数组仅使用恒定数量的元素,因此在C90中不允许int array[n]
(只要n
不是常量)。
MinGW(代码块在Windows上使用的GCC编译器的版本)有一个扩展,允许您在C90模式下编写int array[n]
,其中n
不是常量。 Visual C ++不允许这样做。
答案 3 :(得分:2)
当您编写int array[n]
时,表示您正在执行静态分配。即将在编译时分配内存。因此,在此使用可变长度将导致编译时错误。