You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体类型二维数组内存分配错误排查请求

代码错误分析与修复方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:07:01