malloc分配内存后指针偏移调用free报错:invalid pointer 求助
为什么偏移后的指针调用free会报错?
这个问题的核心规则一定要记牢:free()只能释放malloc/calloc/realloc返回的原始指针——哪怕你移动后的指针还在分配的内存范围内,也绝对不能用它来调用free。
咱们拆解你的代码看看问题出在哪:
- 你用
malloc(4*sizeof(int))分配了一块能存4个int的内存,此时p指向这块内存的起始地址——这个地址是内存分配器唯一认可的、可用于释放的指针。 - 两次
p++操作后:因为p是int类型指针,每次自增会跳过一个int的大小(通常4字节),两次偏移后p已经指向了这块内存的第3个int位置,不再是原始的起始地址。 - 当你调用
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
相关产品推荐
相关产品推荐

