C语言char****四级指针含义及3维数组动态内存分配方法咨询
四级指针含义与三维动态数组分配实现
四级指针char**** hotel的含义
首先明确各级指针对应的语义:
- 你要构造的是三维字符数组,通常对应语义为:
hotel[楼层][房间号] = 住客姓名字符串,该三维数组的首地址类型为char*** - C语言遵循值传递规则,如果要在函数内部修改外部传入的指针变量本身的指向,必须传入该指针变量的地址。此处
initialize_hotel函数需要把内部分配完成的三维数组首地址回传给外部调用者,因此需要接收外部char***类型变量的地址,对应参数类型就是char**** - 函数内部使用
*hotel即可访问到外部传入的char***类型变量,完成赋值操作。
内存分配实现逻辑
分配顺序从最高维向最低维逐层分配,每一步都要做内存分配失败的容错处理,避免内存泄漏。
完整函数实现
#include <stdlib.h> void initialize_hotel(char**** hotel, int n, int m) { // 第一步:分配第一层指针数组,共n个元素,每个元素是char**类型,对应n行 *hotel = (char***)malloc(n * sizeof(char**)); if (*hotel == NULL) { return; } // 第二步:为每一行分配第二层指针数组,每行共m个元素,每个元素是char*类型,对应m列 for (int i = 0; i < n; i++) { (*hotel)[i] = (char**)malloc(m * sizeof(char*)); // 分配失败时释放之前已分配的内存,避免泄漏 if ((*hotel)[i] == NULL) { for (int j = 0; j < i; j++) { free((*hotel)[j]); } free(*hotel); *hotel = NULL; return; } // 第三步(可选):如果需要默认初始化每个字符串为空,可分配1字节存储结束符 for (int j = 0; j < m; j++) { (*hotel)[i][j] = (char*)malloc(sizeof(char)); if ((*hotel)[i][j] == NULL) { // 释放已分配的当前行前面的元素 for (int k = 0; k < j; k++) { free((*hotel)[i][k]); } // 释放前面已经分配完成的行 for (int k = 0; k < i; k++) { for (int l = 0; l < m; l++) { free((*hotel)[k][l]); } free((*hotel)[k]); } free(*hotel); *hotel = NULL; return; } (*hotel)[i][j][0] = '\0'; } } }
调用示例
int main() { char*** hotel; int floor_count = 10; // 行数n int room_per_floor = 20; // 列数m initialize_hotel(&hotel, floor_count, room_per_floor); // 使用示例:给1楼2号房赋值为"Zhang San" // free(hotel[1][2]); // 赋值前要先释放原有空间 // hotel[1][2] = "Zhang San"; 或者用strcpy写入已分配的足够空间 // 释放顺序:从最低维到最高维逐层释放 if (hotel != NULL) { for (int i = 0; i < floor_count; i++) { for (int j = 0; j < room_per_floor; j++) { free(hotel[i][j]); } free(hotel[i]); } free(hotel); } return 0; }
注意事项
- 访问数组元素时
(*hotel)[i][j]等价于外部调用域的hotel[i][j],符合普通三维数组的访问习惯 - 若不需要默认初始化每个字符串,可省略上述第三步的分配逻辑,后续使用时再给每个
hotel[i][j]分配对应长度的内存即可 - 内存释放必须从最低的字符串层级开始释放,逐层向上,否则会出现内存泄漏
内容的提问来源于stack exchange,提问作者Emilio mattar
相关产品推荐
相关产品推荐

