如何使用 new 声明二维数组?
就像,对于“正常”数组,我会:
int* ary = new int[Size]
但
int** ary = new int[sizeY][sizeX]
a) 不工作/编译和 b) 不完成什么:
int ary[sizeY][sizeX]
做。
如果您的行长是编译时间常数,C++11 允许
auto arr2d = new int [nrows][CONSTANT];
看到这个答案。像 gcc 这样允许可变长度数组作为 C扩展的编译器可以使用new 此处所示的方式来获得 C99所允许的完全运行时可变数组维度功能,但可移植的 ISO C 仅限于第一个维度是可变的。
new
否则,您可以使用指向数组的 指针数组 来允许 2D 语法,如连续的 2D 数组,即使它不是一个有效的单个大型分配。您可以使用循环对其进行初始化,如下所示:
int** a = new int*[rowCount]; for(int i = 0; i < rowCount; ++i) a[i] = new int[colCount];
以上, forcolCount= 5和rowCount = 4,将产生以下结果:
colCount= 5
rowCount = 4
delete在删除指针数组之前,不要忘记用循环分别对每一行进行处理。另一个答案中的示例。
delete
应该:
int **ary = new int*[sizeY]; for(int i = 0; i < sizeY; ++i) { ary[i] = new int[sizeX]; }
然后清理将是:
for(int i = 0; i < sizeY; ++i) { delete [] ary[i]; } delete [] ary;
编辑:正如 Dietrich Epp 在评论中指出的那样,这并不是一个轻量级的解决方案。另一种方法是使用一大块内存:
int *ary = new int[sizeX*sizeY]; // ary[i][j] is then rewritten as ary[i*sizeY+j]