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

如何在赋值后正确释放指针数组的已分配内存?

报错根本原因
  • 你执行array[0] = "a"时,完成的是指针赋值操作,直接覆盖了array[0]之前从malloc拿到的堆内存地址。此时array[0]存储的是字符串常量"a"的地址,这类常量存储在程序的只读数据段,不属于malloc分配的堆内存区域。
  • free函数只能释放由malloc/calloc/realloc动态分配在堆上的内存,尝试释放只读数据段的地址自然会触发「pointer being freed was not allocated」报错。
  • 额外问题:你原来malloc分配给array[0]的堆内存因为地址被覆盖,再也找不到释放入口,会造成内存泄漏。
    同时你给array[0]分配内存的写法存在逻辑错误:如果是要存储字符串,应该分配char类型的空间,你写的2*sizeof(char *)实际分配的是2个指针的大小(64位系统下为16字节),虽然不会直接报错,但不符合分配字符串内存的预期,正确写法是malloc(2 * sizeof(char))。
正确处理方案

根据你的使用场景二选一即可:

场景1:需要修改字符串内容

用字符串拷贝函数把内容写入已分配的堆内存,不要直接覆盖指针:

#include <string.h>

// 先给指针数组分配空间
array = malloc(2 * sizeof(char *));
// 给array[0]分配2字节空间存储"a"和结束符'\0'
array[0] = malloc(2 * sizeof(char));
// 复制字符串内容,不会修改array[0]本身存储的堆地址
strcpy(array[0], "a");

// 使用完成后正常释放即可
free(array[0]);
free(array);

场景2:不需要修改字符串内容,直接指向字面量

先释放之前malloc的堆内存,再赋值字符串字面量,后续不需要再对array[0]执行free:

array = malloc(2 * sizeof(char *));
array[0] = malloc(2 * sizeof(char *));
// 先释放已分配的堆内存,避免泄漏
free(array[0]);
// 再指向字符串常量,后续不要对array[0]调用free
array[0] = "a";

// 最后只需要释放array本身的内存即可
free(array);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 13:00:02