为什么C 没有方便的方式来为多维数组动态分配内存
Why C++ does not have a convenient way to dynamically allocate memory for multidimensional array?
在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中学到了这一点,谢谢!)
相关文章:
- unordered_map 与地图与数组 - 内存分析
- 字符指针数组内存分配
- SystemC sc_signal数组内存边界
- 在分配指向数组内存地址的指针时,为什么不必使用地址运算符?
- 指向结构的指针的 2D 数组.内存访问问题
- 连接数组,数组 1 内存消失C++
- 无法使用 GetProcessMemoryInformation 测量静态数组内存使用情况
- 2D 数组内存分配 (malloc) 返回 NULL
- 删除指针成员变量的数组内存
- C++类数组内存重新分配
- 处理静态数组内存C++的内存不足情况
- 为什么析构函数不释放数组内存?
- 获取 std::array 底层数组内存大小的最简单方法?
- C 4D数组内存Deallocation速度很慢
- char*数组内存泄漏
- 数组内存地址总是按最小到最大的顺序排列吗
- C++中的Char*数组内存分配
- 动态数组内存分配如何工作
- JNA 本机函数调用和具有双**指针/数组内存分配的结构
- 了解字符数组内存分配