为什么函数调用后这个对象不能设置为NULL?

时间:2014-08-28 18:32:58

标签: c pointers

#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;通过函数调用进行传递?

1 个答案:

答案 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}}