c++ - 为多维数组创建内存空间

标签 c++ multidimensional-array new-operator dynamic-memory-allocation

我在学c++,在书上找到了这个

array_ptr = new int[3][5][4];

这用于使用 new 为多维数组分配内存。它还指出,虽然第一个维度可以是一个变量,其值在运行时提供,但其他维度必须是常量。 我试着运行这段代码

int *p = new int[3][5][6];

但是显示错误。 有人可以详细说明吗。

最佳答案

这是你想要的:

int (*p)[5][6] = new int[3][5][6];

从 C++11 开始,您可以要求编译器为您推断出 p 的类型:

auto p = new int[3][5][6];

你不需要任何特殊的东西来删除这样的数组:

delete [] p;

类型选择背后的逻辑很简单:

在这一行中:int *p = new int[10] 您正在创建一个 10 整数数组 并且您使用指向 int 的指针 code> 来存储地址。

一般情况下,如果您正在分配一个 N 个 T 数组(其中 N 是大小,T 是类型) ,您使用 指向 T 的指针 来存储地址。

同样的规则可以应用于多维数组,因为它们实际上是嵌套的一维数组。

当您尝试分配多维数组时:p = new int[4][5][6],您正在创建一个包含 4 个数组的 数组,其中包含 5 个数组,每个数组包含 6 个整数。因此,您需要一个指向由 6 个整数组成的 5 个数组的数组的指针,即 int (*p)[5][6]

换句话说,int [3][4][5] 可以被视为大小为 3 的一维数组。它由类型为 int [4][5] 的其他数组组成。这些数组中的每一个都具有大小 4 并且由类型为 int [5] 的其他数组组成,这些数组又包含 5 ints.


P.S. 其他答案的作者似乎更喜欢使用 int *** 并分别为每个嵌套数组分配内存。这样做可能看起来很聪明,但实际上它要慢得多而且危险(如果你弄乱了你的内存管理)。该技巧的唯一优点是它提供了我们都习惯使用的便捷界面 (p[z][y][x])。

但是有一个更好的解决方案:int *p = new int[x_sz * y_sz * z_sz];。您需要将 3D 索引转换为 1D 索引(p[x + x_sz * (y + z * y_sz)] 而不是 p[z][y][x]) 让它工作,但在我看来它仍然更方便(而且绝对更快)。

当然,在实际代码中,您应该使用 std::vector 来存储这样的数组编写您自己的包装类,它会自动计算索引。

关于c++ - 为多维数组创建内存空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44003942/

相关文章:

c++ - JUCE 断言失败 - iOS 上的 IIRFilter

c - C中多维字符串数组的内存溢出

python - 在 2D 数组上创建 4D View 以将其划分为固定大小的单元格

c - C 中动态分配二维数组的运行时错误

c++ - opencv中的视频数据

c++ - 带有参数包的模板特化

c++ - 浮点值问题

c++ - 重载运算符是其他类中的新增功能

c++ - operator new[] 和非 POD 类型

c++ - 过度分配新/删除