C malloc & free 实际例子

数据到底存在哪里?

test2.c

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

typedef struct data{
    char *name ;
    int age;
}student;

student *stu_create(char *name, int name_len,int age)
{
    student *stu = (student *)malloc(sizeof(student));
    stu->name = (char *)malloc(name_len);
    memcpy(stu->name, name, name_len);
    stu->age = age;
    return stu;
}

void stu_release(student *stu)
{
    //free(stu->name);
    //stu->name = NULL;
    free(stu);
}

int main()
{
    char *name = "abc";
    student *stu = stu_create(name, 3, 10);
    printf("%s %d\n",stu->name, stu->age);
    char *tmp = stu->name;
    stu_release(stu);
    stu = NULL;
    printf("%s\n",tmp);
    return 0;
}

上面的程序,
在create函数里面分配了stu->name的内存
但在release函数里面没有free stu->name,(我把它注释掉了)

运行结果为
这里写图片描述

使用 valgrind

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test2

最后会发现内存泄漏,有3个字节的内存空间并没有被释放调
这里写图片描述

当把, 下面两句加上后

free(stu->name);
stu->name = NULL;

运行如下,并且可以valgrind,没有内存泄漏
这里写图片描述


这里写图片描述

通过打印地址,可以看到在create函数中malloc内存后
stu->name 和 main函数里面的name 地址不一样,一个是堆,一个是栈上的。


还有一种方式

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

typedef struct data{
    char *name ;
    int age;
}student;

student *stu_create(char *name, int age)
{
    student *stu = (student *)malloc(sizeof(student));
    stu->name = name;
    stu->age = age;
    return stu;
}

void stu_release(student *stu)
{
    free(stu);
}

int main()
{
    char *name = "abc";
    printf("%x\n", name);
    student *stu = stu_create(name, 10);
    printf("%x %x\n",stu->name, stu->age);
    stu_release(stu);
    stu = NULL;
    return 0;
}

这里写图片描述
这样name stu->name都在栈上


这里写图片描述
stu->name在只读内存上(即 main函数中的char *name),所以修改会出错

这里写图片描述
stu->name分配了内存,对其修改没有任何问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值