关于3D数组matrix内存分配实现的技术咨询
实现3D lr类型矩阵的内存分配函数
我来给你拆解这段用于创建3D lr类型矩阵的代码——这里的lr是double类型的别名,函数能帮你生成可以通过matrix[i][j][k](i对应x方向、j对应y方向、k对应z方向)直接访问的3D数组。
函数基础说明
这个函数lr_3D_matrix接收三个参数m、n、o,分别对应x、y、z三个维度的尺寸,最终返回一个指向3D矩阵的指针。
你提供的代码片段
// lr是double类型的typedef lr ***lr_3D_matrix(int m, int n, int o)/** \brief 创建尺寸为[m, n, o]的lr类型3D矩阵*/ { lr ***matrix; int i, j; matrix = malloc(m * sizeof(lr **)); // 分配第一维度(x方向)的指针数组
补充完整的内存分配逻辑
你目前的代码只完成了第一维度的内存分配,直接这样使用会出现内存访问错误。要实现完整可用的3D矩阵,需要循环分配第二、第三维度的内存,同时还要加上内存分配失败时的错误处理(避免内存泄漏),完整代码如下:
// lr是double类型的typedef lr ***lr_3D_matrix(int m, int n, int o)/** \brief 创建尺寸为[m, n, o]的lr类型3D矩阵*/ { lr ***matrix; int i, j; // 分配第一维度:存储指向第二维度的指针数组 matrix = malloc(m * sizeof(lr **)); if (matrix == NULL) return NULL; // 检查内存分配是否成功 for (i = 0; i < m; i++) { // 分配第二维度:每个x索引下,存储指向第三维度的指针数组 matrix[i] = malloc(n * sizeof(lr *)); if (matrix[i] == NULL) { // 分配失败时释放已分配的内存,避免泄漏 while (--i >= 0) free(matrix[i]); free(matrix); return NULL; } for (j = 0; j < n; j++) { // 分配第三维度:每个(x,y)索引下,存储实际的lr类型数据 matrix[i][j] = malloc(o * sizeof(lr)); if (matrix[i][j] == NULL) { // 逐层释放已分配的内存 while (--j >= 0) free(matrix[i][j]); free(matrix[i]); while (--i >= 0) { for (int k = 0; k < n; k++) free(matrix[i][k]); free(matrix[i]); } free(matrix); return NULL; } } } return matrix; }
配套的内存释放函数
使用完这个3D矩阵后,记得要逐层释放内存,避免内存泄漏:
void free_lr_3D_matrix(lr ***matrix, int m, int n) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { free(matrix[i][j]); } free(matrix[i]); } free(matrix); }
内容的提问来源于stack exchange,提问作者datapanda
相关产品推荐
相关产品推荐

