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

C语言释放realloc偏移指针报free(): invalid pointer错误原因查询

问题核心原因

free()函数的入参必须是malloc、calloc、realloc直接返回的原始指针值,任何对原始指针做偏移得到的指针都不能直接传给free(),这是C语言内存管理的硬性规则。

具体原理

  • 堆内存分配器在分配内存时,会在返回给你的指针地址的前置内存空间存储当前内存块的元数据(比如块总长度、使用标记等),你传入偏移后的指针p+1时,分配器找不到有效的元数据结构,自然就抛出invalid pointer错误。
  • 你通过realloc循环扩容得到的是一整块连续的内存,整块内存只能整体调用free(p)释放,不支持拆分释放单个偏移位置的内存段。
修正方案

如果你只需要释放整段内存,直接把free(p+1)改成free(p)即可。
如果你确实需要单独释放数组中的单个元素,需要改成指针数组的分配方式,单独给每个元素申请堆内存,示例代码如下:

#include <stdio.h>
#include <stdlib.h>

struct s {
    int x;
};
int main()
{
    struct s **p = NULL;
    for (int i = 0; i < 3; i++) {
        if ((p = realloc(p, (i+1) * sizeof(struct s*))) != NULL) {
            p[i] = malloc(sizeof(struct s));
            if(p[i] == NULL) exit(EXIT_FAILURE);
            p[i]->x = i*10;
        } else exit(EXIT_FAILURE);
    }
    for (int i=0;i<3;i++) {printf("%d ", p[i]->x);}
    // 可单独释放单个元素
    free(p[1]);
    p[1] = NULL;
    // 最后释放指针数组本身
    free(p);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:27:00