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

malloc分配内存后指针偏移调用free报错:invalid pointer 求助

为什么偏移后的指针调用free会报错?

这个问题的核心规则一定要记牢:free()只能释放malloc/calloc/realloc返回的原始指针——哪怕你移动后的指针还在分配的内存范围内,也绝对不能用它来调用free。

咱们拆解你的代码看看问题出在哪:

  1. 你用malloc(4*sizeof(int))分配了一块能存4个int的内存,此时p指向这块内存的起始地址——这个地址是内存分配器唯一认可的、可用于释放的指针。
  2. 两次p++操作后:因为p是int类型指针,每次自增会跳过一个int的大小(通常4字节),两次偏移后p已经指向了这块内存的第3个int位置,不再是原始的起始地址。
  3. 当你调用free(p)时,内存分配器拿到这个偏移后的地址,根本找不到对应的内存块元数据(分配器会在每个内存块的开头存储管理信息,比如块的大小、下一个块的地址等),所以直接判定这是无效指针,抛出了你看到的错误。

修正后的代码示例

解决方法很简单:保存好malloc返回的原始指针,用另一个指针做偏移操作即可:

#include <stdio.h>
#include <stdlib.h> // 别忘了包含这个头文件,malloc和free的声明在这里

int main() { // 标准C要求main的返回类型是int,不是void
    int *original_ptr = malloc(4 * sizeof(int)); // C标准允许void*隐式转为其他指针,无需强制转换
    if (original_ptr == NULL) { // 最好加个判断,防止malloc分配失败
        printf("malloc failed!\n");
        return 1;
    }
    
    int *p = original_ptr; // 用临时指针来做偏移操作
    p++;
    p++;
    // 在这里可以正常使用p指向的内存
    
    free(original_ptr); // 必须用原始指针释放内存
    return 0;
}

额外提醒

  • 永远不要用偏移后的指针、栈内存指针或野指针调用free,这属于未定义行为,轻则报错崩溃,重则破坏其他内存数据。
  • 一定要包含<stdlib.h>,否则malloc和free的函数声明可能缺失,会引发未定义行为。
  • 标准C中main函数的返回类型必须是int,建议养成返回0的习惯,表示程序正常退出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:38:06