动态分配Array结构体指针矩阵报错,求排查代码问题
问题排查与修正方案
嘿,我一眼就瞅出问题所在啦——你只给矩阵的最外层分配了内存,内层的行指针和每个Array结构体的内存都没分配,导致mat[i][j]是个野指针,访问它的size和arr成员肯定会触发错误!
核心问题拆解
你当前的代码只做了第一步:分配了5个指向行的指针(Array*** mat = malloc(5 * sizeof(Array**))),但:
- 每一行的5个
Array*指针数组没分配内存 - 每个位置
[i][j]对应的Array结构体实例也没分配内存
这就像你建了个书架框架,但每层的隔板和每个放书的格子都没做,直接往空架子上放书肯定会掉下去~
修正后的完整代码
#include <stdlib.h> // 假设你的random_numbers函数定义如下(示例) short* random_numbers(unsigned short* size) { *size = 10; // 示例:设置数组大小为10 short* arr = malloc(*size * sizeof(short)); if (arr) { for (unsigned short k = 0; k < *size; k++) { arr[k] = rand() % 100; // 生成随机数 } } return arr; } typedef struct _Array { short *arr; unsigned short size; } Array; int main() { // 1. 分配最外层:5个行指针 Array ***mat = (Array***)malloc(5 * sizeof(Array**)); if (!mat) { // 内存分配失败处理,比如打印错误并退出 return 1; } for (short i = 0; i < 5; i++) { // 2. 分配每一行的列指针数组(5个Array*) mat[i] = (Array**)malloc(5 * sizeof(Array*)); if (!mat[i]) { // 这里要记得释放已经分配的内存,避免泄漏 for (short k = 0; k < i; k++) { free(mat[k]); } free(mat); return 1; } for (short j = 0; j < 5; j++) { // 3. 分配单个Array结构体的内存 mat[i][j] = (Array*)malloc(sizeof(Array)); if (!mat[i][j]) { // 同样要释放已分配的资源 for (short k = 0; k < j; k++) { free(mat[i][k]); } free(mat[i]); for (short k = 0; k < i; k++) { free(mat[k]); } free(mat); return 1; } // 现在可以安全初始化成员了! mat[i][j]->arr = random_numbers(&mat[i][j]->size); } } // -------------------------- // 这里可以添加你的业务逻辑代码 // -------------------------- // 最后记得逐层释放内存,避免泄漏 for (short i = 0; i < 5; i++) { for (short j = 0; j < 5; j++) { free(mat[i][j]->arr); // 先释放arr数组 free(mat[i][j]); // 再释放Array结构体 } free(mat[i]); // 释放行指针数组 } free(mat); // 释放最外层行指针 return 0; }
关键注意事项
- 逐层分配内存:三层指针需要从外到内依次分配,每一层都不能少
- 检查分配结果:每次
malloc后都要判断是否成功,避免空指针访问;如果失败,一定要释放已经分配的内存,防止内存泄漏 - 反向释放内存:释放时要和分配顺序相反,先释放最内层的
arr,再释放Array结构体,接着释放行指针数组,最后释放最外层的行指针
内容的提问来源于stack exchange,提问作者dor
相关产品推荐
相关产品推荐

