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
相关产品推荐
相关产品推荐

