调用free(arr2)触发'munmap_chunk(): invalid pointer'错误求助
解决realloc后free报错"munmap_chunk(): invalid pointer"的问题
问题场景
使用命令gcc -g -std=c99 src.c编译以下代码:
#include <stdio.h> #include <stdlib.h> void fill(int* arr, int len, int val) { for (int i = 0; i < len; ++i) arr[i] = val; } int main() { printf("Hello World\n"); int *p1, *p2; int *arr1 = malloc (sizeof(int) * 10); int *arr2 = malloc (sizeof(int) * 10); printf("BEFORE======================\narr1=%p, arr2=%p\n", arr1,arr2); fill(arr1, 10, 17); fill(arr2, 10, 23); p1 = &arr1[9]; p2 = &arr2[9]; printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2); arr1 = realloc(arr1, 200); arr2 = realloc(arr2, 200); printf("AFTER======================\narr1=%p, arr2=%p\n", arr1,arr2); fill(arr1, 200, 239); fill(arr2, 200, 347); printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2); p1 = &arr1[99]; p2 = &arr2[99]; printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2); free(arr2); free(arr1); return 0; }
运行程序时,调用free(arr2)崩溃,报错munmap_chunk(): invalid pointer,内存转储显示重分配后数组内存疑似重叠。
问题原因
realloc内存大小参数错误:
realloc(arr1, 200)和realloc(arr2, 200)中的200是字节数,但后续调用fill(arr1, 200, 239)时,是按200个int元素来填充的。假设int占4字节,200个int需要200*4=800字节内存,但realloc只分配了200字节,导致缓冲区溢出,直接破坏了堆内存的管理结构,最终触发free时的指针有效性检查错误。悬空指针访问的未定义行为:
realloc可能会将内存块移动到新的地址空间,此时p1、p2仍指向原内存地址,后续对*p1、*p2的访问属于访问悬空指针,这会进一步加剧堆内存的损坏,增加程序崩溃的概率。
解决方案
修正realloc的内存大小计算:
明确按元素个数计算所需内存,将realloc的参数改为sizeof(int)*200,确保分配的内存能容纳200个int元素:arr1 = realloc(arr1, sizeof(int)*200); arr2 = realloc(arr2, sizeof(int)*200);避免使用悬空指针:
realloc执行后,若原内存地址被移动,之前保存的指针(如p1、p2)立即失效,不要继续使用这些指针访问内存。如果需要访问新内存中的元素,应重新获取地址:// realloc之后重新获取指针 p1 = &arr1[9]; p2 = &arr2[9];
内容的提问来源于stack exchange,提问作者Abhijeet Mohapatra
相关产品推荐
相关产品推荐

