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

C语言动态数组free释放内存时报指针未分配错误排查

问题排查结论

报错和calloc本身无关,是代码里的内存操作逻辑错误导致的,核心问题出在主函数的realloc调用上,附带几个隐藏的逻辑bug:

  • realloc用法完全错误:realloc调整内存空间时可能将原有内存块迁移到新的堆地址,它的返回值才是调整后内存块的有效起始地址。你写的realloc(newArr->items, 10);没有接收返回值,一旦内存发生迁移,newArr->items存储的就是被realloc回收的旧地址,属于野指针,后续free这个地址时,系统找不到对应分配记录,就会抛出“指针未被分配”的错误。
  • realloc传入的内存大小参数错误:你存储的是int类型数据,要扩容到10个元素的话,需要申请的空间大小是10 * sizeof(int),直接传10仅申请了10字节,连3个int都存不下,后续往索引5的位置写入int值属于堆内存越界写入,会破坏堆维护的内存块元数据,同样会触发内存释放报错。
  • 数组创建逻辑存在隐藏bug:create_array函数的CHAR分支写死了分配5个char的空间,没有使用传入的initial_size参数,创建字符类型数组时实际大小和预期不符。
  • 扩容后未同步更新数组元数据:调用realloc扩容后没有修改Array结构体的size字段,数组大小仍为初始值5,后续遍历、操作数组时会出现逻辑错误。
修正示例

扩容逻辑需要按如下方式编写,避免野指针和内存越界:

// 用临时指针接收realloc返回值,防止分配失败时丢失原内存指针
void *temp = realloc(newArr->items, 10 * sizeof(int));
if (temp == NULL) {
    perror("array expand failed");
    destroy_array(newArr);
    exit(1);
}
newArr->items = temp;
newArr->size = 10; // 同步更新数组大小字段

另外需要把create_array里CHAR分支的硬编码大小改成和其他分支一致的逻辑,使用传入的初始大小计算分配空间:

case CHAR:
    arr->items = (char *) calloc(arr->size, sizeof(char));
    break;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:15:32