小编典典

如何使用 new 在 C++ 中声明二维数组?

all

如何使用 new 声明二维数组?

就像,对于“正常”数组,我会:

int* ary = new int[Size]

int** ary = new int[sizeY][sizeX]

a) 不工作/编译和 b) 不完成什么:

int ary[sizeY][sizeX]

做。


阅读 131

收藏
2022-03-06

共1个答案

小编典典

如果您的行长是编译时间常数,C++11 允许

auto arr2d = new int [nrows][CONSTANT];

看到这个答案。像 gcc 这样允许可变长度数组作为 C扩展的编译器可以使用new 此处所示的方式来获得 C99所允许的完全运行时可变数组维度功能,但可移植的 ISO C 仅限于第一个维度是可变的。


否则,您可以使用指向数组的 指针数组 来允许 2D 语法,如连续的 2D
数组,即使它不是一个有效的单个大型分配。您可以使用循环对其进行初始化,如下所示:

int** a = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
    a[i] = new int[colCount];

以上, forcolCount= 5rowCount = 4,将产生以下结果:

在此处输入图像描述

delete在删除指针数组之前,不要忘记用循环分别对每一行进行处理。另一个答案中的示例。

int** ary = new int[sizeY][sizeX]

应该:

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]
2022-03-06