malloc与free的配对使用的注意

malloc与free要配对使用,但是若对指针的相关操作不注意,同样会导致错误。
首先来看下面的一个小例子:

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

int main()
{
    char *c = (char *)malloc(sizeof(char)*5);
    bzero(c, 5);

    printf("--%x\n", c);

    char c2[] = "abcd";
    c = c2;

    printf("--%x\n", c);
    printf("--%x\n", c2);

    free(c);
    c = NULL;
    return 0;
}

例子很简单,先malloc一块内存,然后赋值,最后再free。但运行就出错
这里写图片描述
产生了段错误。
再来看打印出的地址信息,地址被更改了。
原来是通过 c=c2 操作,c指向了c2所指向的内存。指向地址发生了改变。而这时,地址0x32745a50由c和c2共同指向。free(c)会释放掉所share的内存,导致出错。

由于不是拷贝,导致指针指向发生改变。

若对代码进行如下修改

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

int main()
{
    char *c = (char *)malloc(sizeof(char)*5);
    bzero(c, 5);

    printf("--%x\n", c);

    char c2[] = "abcd";
    //c = c2;
    ```
    strcpy(c, c2);
    ```

    printf("--%x\n", c);
    printf("--%x\n", c2);

    free(c);
    c = NULL;
    return 0;
}

将指针的赋值操作改为拷贝,这样malloc分配的内存里就有了内容,c的指向也不会改变。
这里写图片描述

总结:
(1)指针的指向的改变
(2)操作可控内存空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值