C通过引用传递(指针)崩溃

时间:2016-09-20 21:34:21

标签: c

我有这段代码:

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

typedef struct employee {
    char *name;
    double salary;
} employee;

void new_employee (employee *person, char *name, double salary) {
    person = malloc(sizeof(employee));
    person->name = malloc(strlen(name) + 1);
    strcpy(person->name, name);
    person->salary = salary;
    printf("Employee: name=%s salary=%f\n", person->name, person->salary);
}


int main(int argc, char *argv[])
{
    employee *bob = 0;
    new_employee(bob, "Bob Doe", 1000);
    printf("Employee: name=%s salary=%f\n", bob->name, bob->salary);
    return 0;
}

我不确定是什么问题,但我可以在new_employee中使用该结构,但是当我尝试从main使用它时它会中断。基本上第一个printf工作,第二个崩溃。我认为主要是没有让bob更新,但我使用的是指针,所以它应该通过引用传递。

1 个答案:

答案 0 :(得分:3)

您的问题是new_employee()无法更改main中的bob指针。您可以使用双指针使其工作。您可以想到指针意味着您通过引用传递结构,但指针值本身仍然按值传递。如果将指针传递给指针,则可以将指针bob更改回main。

但是,我认为更好的解决方案是让new_employee()返回指针。然后在main中你只需将结果分配给bob。像这样:

employee *new_employee (char *name, double salary) {
    employee *person = malloc(sizeof(employee));
    person->name = malloc(strlen(name) + 1);
    strcpy(person->name, name);
    person->salary = salary;
    printf("Employee: name=%s salary=%f\n", person->name, person->salary);
    return person;
}


int main(int argc, char *argv[])
{
    employee *bob = 0;
    bob = new_employee("Bob Doe", 1000);
    printf("Employee: name=%s salary=%f\n", bob->name, bob->salary);
    return 0;
}

另请注意,您应该进行错误检查(例如,如果malloc()失败了怎么办?),您还应该在free()bob->name上使用bob在程序结束之前。如果您分配了大量新员工,并且在完成后不要free()他们,那么您可能会毫无理由地耗尽大量内存(内存泄漏)。

你可以制作一个免费的功能,例如:

void free_employee(employee *person) {
  free(person->name);
  free(person);
}