我有这段代码:
#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更新,但我使用的是指针,所以它应该通过引用传递。
答案 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);
}