为什么C 没有方便的方式来为多维数组动态分配内存

Why C++ does not have a convenient way to dynamically allocate memory for multidimensional array?

本文关键字:数组 内存 动态分配 方式 方便 为什么      更新时间:2023-10-16

在C 中,我感到非常不便,因为C 没有内置功能可以在运行时动态分配内存,以分配多维数组。

在Java中,我们只能按一行代码进行操作。例如,在Java中,我们可以将内存动态分配给4D整数阵列的内存

int a, b, c, d;
std::cin>>a>>b>>c>>d;
int[ ][ ][ ][ ] array = new int[a][b][c][d];

我在c 中搜索了解决方案。但是我发现,在C 中,我们必须使用具有功能的嵌套循环,容器或某些结构来实现同一件事。由于这样的语法功能将非常方便,所以我想问为什么C 没有包含这样的内置功能?

在C 中您也可以以这种方式分配内存。例如:)

auto array = new int[3][4][5][6];

或那是相同的

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

或者您可以使用类型

typedef int T[4][5][6];
// or
// using T = int[4][5][6];
T *array = new T[3];

问题是,除了最左边的正方形中的表达式必须是恒定表达式。

首先,切勿使用new。所有事物都有更好的选择。

步骤零,正确包括

#include <gsl/multi_span>
#include <memory>

第一步,设置尺寸

constexpr int x_sz = 3;
constexpr int y_sz = 4;
constexpr int z_sz = 5;
constexpr int total = x_sz * y_sz * z_sz;

第二步,分配内存

auto arrptr = std::make_unique<int[]>( total );

第三步,创建一个数组视图

gsl::multi_span<int, x_sz, y_sz, z_sz> arr3d { arrptr.get(), total };

恭喜,您有一个界限检查的三维阵列

时,这将使自己分配自身。

您可以在这里找到GSL

我们还可以创建一个2D矩形大小(m,n)为

auto array = (int (*)[N]) new int [ M*N ];

和一个大小的3D阵列(l,m,n)为

auto array = (int (*)[M][N]) new int [ L*M*N ];

等(其中l,m,n,...可以是变量)。为此定义宏可能很方便。另外,如果大小很小,我们可以简单地做

int array[M][N];

(我之前从Stackoverflow中学到了这一点,谢谢!)