动态数组声明的不同方式
dynamic array declaration in different ways
我知道int* array = new int [n];
在堆中分配内存空间。
但是如果我在代码块中声明这样的东西:int array[n];
,它编译成功,但如果我将它移动到visual studio,它会出现错误。
我想问的是:
-
int[n]
真正做什么,它如何与堆分配相比?它们之间有什么区别? -
如果我使用
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中允许)。
如果我正确理解了你的问题,那么我可以回答这两个问题。
-
int array[10]
是在堆栈上分配的,而int *array = new int[10]
是在堆上分配的。通常,堆栈数组只能使用固定数量的元素,因此在C90中不允许使用int array[n]
(只要n
不是常量)。 -
MinGW(这是codeblocks在windows上使用的GCC编译器的版本)有一个扩展,允许您在C90模式下编写
int array[n]
,其中n
不是常量。Visual c++不允许这个
当您编写int array[n]
时,这意味着您正在执行静态分配。也就是说,内存将在编译时分配。因此,在这里使用可变长度将导致编译时错误。
- 如何以优化的方式同时迭代两个间距不相等的数组
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 在C++中,建议通过数组循环的方式是什么?
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 如何以这种方式处理字符串数组
- 数组数据以错误的方式遍历 Python/Matlab
- 使用分而治之的最大总和子数组,为什么要以不同的方式使用 for 循环,答案是错误的?
- 使用字节数组具有单字节对齐方式的结构是否安全
- 有没有一种递归的方式来制作这个字符串数组?
- 以类似数组的方式访问结构成员:在与数组不同的结构中填充?
- C 结构具有CHAR数组以不寻常的方式初始化为零
- 动态规划 - 在数组中查找目标求和方式
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 一维数组映射方式的性能差异问题
- 在动态 2-D 数组中填充 0 的更简洁的方式C++
- 我需要以尺寸方式计算数组的平均值
- 如何以递归方式反转任何数组?(不使用C++标准库)
- 在编译时以增量方式创建数组
- 为什么在指针和数组的情况下,字符数组的处理方式不同