int d;
cin >> d;
int asdf[d];
这被视为动态内存分配吗?根据{{3}},似乎我甚至不能编译它,因为不使用new运算符的数组只能以常量大小声明,也许我读错了。 (我正在使用CodeBlocks和GNU CCC编译器)
它和
之间有什么区别int d;
int *asdf;
cin >> d;
asdf = new int[d];
在删除数组之前,使用new生成的数组是唯一的区别,而第一个数组在离开范围后会立即释放吗?
答案 0 :(得分:9)
int x[n];
是可变长度数组(VLA),它具有自动存储持续时间(即“在堆栈上”)。它在C89或C ++ 98/03中无效,但它是在C99中引入的,并且通常作为扩展名提供,例如在GCC。
在一些具有非标准alloca()
功能的平台上也可以模仿该功能,该功能在VLA变得普遍之前使用。
答案 1 :(得分:1)
使用第一种方法分配的内存来自分配给应用程序的堆栈。当你使用new时,内存是从堆中分配的,堆可以提供足够的内存,而不是从堆栈中获取。但是要使用new,你的变量必须是与数组相同类型的指针。指针变量保存第一个存储单元的地址。 int * a = new int [x];将保存x个存储单元,如果在程序仍在运行时专门删除指针,将被释放。