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

调用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,内存转储显示重分配后数组内存疑似重叠。

问题原因

  1. realloc内存大小参数错误:
    realloc(arr1, 200)和realloc(arr2, 200)中的200是字节数,但后续调用fill(arr1, 200, 239)时,是按200个int元素来填充的。假设int占4字节,200个int需要200*4=800字节内存,但realloc只分配了200字节,导致缓冲区溢出,直接破坏了堆内存的管理结构,最终触发free时的指针有效性检查错误。

  2. 悬空指针访问的未定义行为:
    realloc可能会将内存块移动到新的地址空间,此时p1、p2仍指向原内存地址,后续对*p1、*p2的访问属于访问悬空指针,这会进一步加剧堆内存的损坏,增加程序崩溃的概率。

解决方案

  1. 修正realloc的内存大小计算:
    明确按元素个数计算所需内存,将realloc的参数改为sizeof(int)*200,确保分配的内存能容纳200个int元素:

    arr1 = realloc(arr1, sizeof(int)*200);
    arr2 = realloc(arr2, sizeof(int)*200);
    
  2. 避免使用悬空指针:
    realloc执行后,若原内存地址被移动,之前保存的指针(如p1、p2)立即失效,不要继续使用这些指针访问内存。如果需要访问新内存中的元素,应重新获取地址:

    // realloc之后重新获取指针
    p1 = &arr1[9];
    p2 = &arr2[9];
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:05:13