malloc后free出错 (释放了错误的地址空间)

本文分析了在C语言编程中常见的malloc后free操作出错的情况,详细解释了当指针地址被改变后再进行free操作可能导致的coredump问题,并提供了解决方案。通过保留原始指针地址,在free时释放正确的内存空间,避免程序崩溃。

malloc后free出错

问题

程序malloc后,free时 core dump
源程序如下(举例):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *buf;
    buf = (int *)malloc(sizeof(int));
    buf++;
    free(buf);
    return 0;
}

出错信息如下:
在这里插入图片描述

原因分析

指针 buf 的地址在 malloc 之后地址被改变,导致 free 时 free的不是以前的空间,因此出错。
上面举例很简单,意图也很明显,buf++ 就是为了说明 buff 地址被改变。
我们日常编程中遇到的问题肯定不会这么明显,但是程序中很可能就出现了类似的错误。比如在取地址时为了取到后面数据,对地址进行了改变。因此才会出现上述错误。
这种问题只需要 free 正确的地址就可。

解决方法

程序修改如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *buf;
    int *buf_src = NULL;
    buf = (int *)malloc(sizeof(int));
    buf_src = buf;
    buf++;
    free(buf_src);
    return 0;
}

增加一个指针变量 buf_src,用于保存原指针 buf 的地址,
现在 free(buf_src),既是对 malloc 时 指针 buf 地址空间的释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值