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

C语言realloc扩容结构体数组后free旧内存触发断点问题求助

问题核心原因
  • 重复释放内存:realloc 函数执行成功时,会自动释放你传入的旧内存块(也就是 *pitemList 指向的内存),你代码中在 realloc 成功后又手动调用 free(*pitemList),属于非法的重复释放操作,直接触发了系统内存检测的断点,是你报错的直接原因。
  • 无意义的死循环:你写的 do{}while(temp == NULL) 逻辑没有任何退出路径,如果系统内存不足导致 realloc 持续返回NULL,程序会永久卡死在这个循环中,合理的做法是分配失败时返回错误标识给上层调用者处理。
  • 多余的判断逻辑:if(listLength!=0) 这个判断完全没必要,就算 listLength 是0,只要 realloc 成功旧内存也会被自动处理,不需要你额外判断。
修正后的代码实现
// 函数返回值改为int,0表示成功,-1表示分配失败
int addSpace(struct GroceryItem** pitemList, int listLength)
{
    int newSize = listLength + 1;
    struct GroceryItem * temp = realloc(*pitemList, newSize * sizeof(struct GroceryItem));
    // 分配失败直接返回错误,不要死循环
    if (temp == NULL) {
        return -1;
    }
    // realloc成功直接赋值即可,不需要手动释放旧内存
    *pitemList = temp;
    _CrtDumpMemoryLeaks();
    return 0;
}
额外注意事项

如果后续要实现缩容逻辑,也直接调用 realloc 传入更小的容量即可,依旧不需要手动释放旧内存,realloc 会自动处理内存块的保留、拷贝、释放操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:57:02