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

