数据到底存在哪里?
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分配了内存,对其修改没有任何问题