📜  如何在 C++ 中动态分配 3D 数组(1)

📅  最后修改于: 2023-12-03 14:52:15.141000             🧑  作者: Mango

如何在 C++ 中动态分配 3D 数组

在 C++ 中,我们可以使用指针的方式来动态分配 3D 数组。其一般的步骤是:

  1. 分配一个一维数组,其大小为 $width * height * depth$。可以使用 newmalloc 函数来实现。

  2. 按照 C++ 的语法将其转化为一个三维指针。不同于二维指针的初始化方法,三维指针的初始化方法需要用到两个中间指针,从而完成从一维数组到三维指针的转变。

下面提供一个示例代码:

int*** allocate_3d(int width, int height, int depth) {
    int* data = new int[width * height * depth];
    int*** array3d = new int**[width];
    for (int i = 0; i < width; ++i) {
        array3d[i] = new int*[height];
        for (int j = 0; j < height; ++j) {
            array3d[i][j] = data + (i * height + j) * depth;
        }
    }
    return array3d;
}

void release_3d(int*** array3d) {
    delete[] array3d[0][0];
    delete[] array3d[0];
    delete[] array3d;
}

其中 allocate_3d 是分配 3D 数组的函数,其参数为 $width$,$height$,$depth$,分别代表 3D 数组的宽度、高度和深度。该函数返回一个指向动态分配的 3D 数组的指针。将该函数的返回值命名为 $arr$,则 $arr[i][j][k]$ 可以表示 3D 数组的第 $i$ 个元素的第 $j$ 行第 $k$ 列的值。使用完该数组后,可以使用 release_3d 函数释放该数组所占用的内存。

使用示例如下:

int main() {
    int width = 3, height = 4, depth = 5;
    int*** arr = allocate_3d(width, height, depth);
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            for (int k = 0; k < depth; ++k) {
                arr[i][j][k] = i * height * depth + j * depth + k;
                printf("%d ", arr[i][j][k]);
            }
            printf("\n");
        }
        printf("-----------\n");
    }
    release_3d(arr);
    return 0;
}

输出:

0 1 2 3 4 
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19 
-----------
20 21 22 23 24 
25 26 27 28 29 
30 31 32 33 34 
35 36 37 38 39 
-----------
40 41 42 43 44 
45 46 47 48 49 
50 51 52 53 54 
55 56 57 58 59 
-----------

可见,我们成功使用指针方式动态分配了一块三维数组内存,并取得了正确的输出。