#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");
}
}
Program output is:
Person deleted
Person not deleted
My question is: why doesn't person1
point to NULL
? It seems like the memory is freed (because if I try to use it I get an error), but why is the pointer still pointing to something (apparently) valid? Why doesn't person = 0;
get carried across the function call?
To parameter's value change be see outside your function (and not only locally, like you're seeing) you need to take a struct Person ** person
(note **
) instead of.
EDIT: note that you're accessing memory which you don't own anymore in:
person->first_name = 0;
person->last_name = 0;
Because you've already freed person
Try this:
void delete_person(struct Person ** person)
{
struct Person *p = *person;
free(p->first_name);
free(p->last_name);
free(*person);
*person = 0;
}
And call using:
delete_person(&person1);
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments