结构体类型二维数组内存分配错误排查请求
代码错误分析与修复方案
1. 无效的内存分配检查
你声明的cell* array[rows]是栈上的指针数组,它本身永远不会是NULL。真正可能分配失败的是每个array[i]对应的malloc调用,当前的检查逻辑完全起不到作用。
修复方式:在每次malloc后立即检查是否成功,同时要释放已分配的内存避免泄漏:
for (unsigned long i = 0; i < rows; i = i + 1) { array[i] = malloc(columns * sizeof(cell)); if (array[i] == NULL) { // 释放已成功分配的内存 for (unsigned long k = 0; k < i; k++) free(array[k]); printf("Error in main: Memory could not be allocated.\n"); return 3; } }
2. 函数参数类型不匹配
initialiseArray的第三个参数cell array[rows][columns]会被C编译器退化为cell (*)[columns](指向cell数组的指针),但你传入的array是cell* array[rows](指针数组,每个元素是指向单个cell的指针),两者类型不兼容,会触发编译错误或运行时内存访问异常。
有两种修复思路:
- 思路一:修改函数参数适配指针数组
void initialiseArray(unsigned long rows, unsigned long columns, cell** array) { for (unsigned long i = 0; i < rows; i++) for (unsigned long j = 0; j < columns; j++) { array[i][j].variable_1 = 0; array[i][j].variable_2 = 0; array[i][j].variable_3 = 0; } }
- 思路二:改用连续内存的二维数组分配(适合固定列数的场景)
如果不需要动态调整每行长度,可以一次性分配连续内存,这样能直接匹配原函数的参数:
// 替换main中原指针数组的分配代码 cell (*array)[columns] = malloc(rows * sizeof(*array)); if (array == NULL) { printf("Error in main: Memory could not be allocated.\n"); return 3; }
3. 循环变量类型不匹配
initialiseArray里的循环变量i、j用了int类型,但rows和columns是unsigned long,当行数/列数超过int最大值时,会导致循环条件判断错误。
修复方式:将循环变量改为unsigned long类型:
for (unsigned long i = 0; i < rows; i++) for (unsigned long j = 0; j < columns; j++)
4. 字符串语法错误
printf中的""main""写法错误,连续双引号会被编译器识别为语法错误,应改为"main":
printf("Error in main: Memory could not be allocated.\n");
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

