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

使用realloc扩容Article结构体数组报corrupted size vs. prev_size错误如何解决

问题原因与解决方案

你遇到的报错核心问题全部出在AddArt函数的实现逻辑上:

  • 第一个严重错误:realloc扩容时传入的大小错误。你当前传入的是*nbart * sizeof(Article),和原有数组的大小完全一致,根本没有完成扩容操作。后续执行tart[*nbart] = l时直接越界访问了数组后的非法内存,破坏了堆内存的结构。正确的扩容大小应为(*nbart + 1) * sizeof(Article),需要多预留1个新元素的存储空间。
  • 第二个严重错误:手动释放了realloc传入的旧指针。realloc执行成功时会自动释放旧的内存块,你后续额外执行free(tart)属于双重释放操作,是触发corrupted size vs. prev_size报错的直接原因。
  • 第三个安全隐患:未判断realloc的返回值。如果realloc申请内存失败会返回NULL,直接赋值会导致原数组指针丢失,造成内存泄漏。

修正后的AddArt函数代码

Article * AddArt(Article l,Article *tart,int *nbart)
{
    // 按新的元素个数申请内存
    Article *aux = realloc(tart, (*nbart + 1) * sizeof(Article));
    if(aux == NULL) {
        printf("内存扩容失败\n");
        free(tart);
        exit(1);
    }
    tart = aux;
    // 写入新元素
    tart[*nbart] = l;
    *nbart += 1;
    return tart;
}

其他注意事项

  • 读取ref字段的scanf没有限制输入长度,你的ref数组长度只有6,最多只能存储5个可见字符加末尾的'\0',建议修改为scanf("%5s", l.ref),避免输入过长导致缓冲区溢出。
  • 调用fopen打开文件后建议增加判空逻辑,避免文件不存在或权限不足时程序逻辑异常。

内容的提问来源于stack exchange,提问作者Zipen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:54:03