#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct Person{
char* first_name;
char* last_name;
};
struct Person* create_person(const char* f_name, const char* l_name)
{
struct Person* new_person = malloc(sizeof(struct Person));
new_person->first_name = malloc((1+strlen(f_name))*sizeof(char));
new_person->last_name = malloc((1+strlen(l_name))*sizeof(char));
strcpy(new_person->first_name, f_name);
strcpy(new_person->last_name, l_name);
return new_person;
}
void delete_person(struct Person* person)
{
free(person->first_name);
free(person->last_name);
free(person);
person->first_name = 0;
person->last_name = 0;
person = 0;
if(person){
printf("Person not deleted\n");
}
else{
printf("Person deleted\n");
}
}
int main()
{
struct Person* person1 = create_person("John", "Doe");
delete_person(person1);
if(person1){
printf("Person not deleted\n");
}
else{
printf("Person deleted\n");
}
}
节目输出是:
删除了人
未删除的人
我的问题是:为什么person1
指向NULL
?似乎内存被释放(因为如果我尝试使用它我会得到一个错误),但为什么指针仍然指向一些(显然)有效?为什么没有person = 0;
通过函数调用进行传递?
答案 0 :(得分:2)
要参数的值更改,请在功能之外看到(而不仅仅是在本地,就像您正在看到的那样),您需要struct Person ** person
(注意**
)而不是person->first_name = 0;
person->last_name = 0;
。
编辑:请注意您正在访问您不再拥有的内存:
person
因为您已经释放void delete_person(struct Person ** person)
{
struct Person *p = *person;
free(p->first_name);
free(p->last_name);
free(*person);
*person = 0;
}
试试这个:
delete_person(&person1);
并致电:
{{1}}