C通过引用(指针)传递崩溃
我有以下代码:C通过引用(指针)传递崩溃,c,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(size
#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;
}
#包括
#包括
#包括
typedef结构雇员{
字符*名称;
双薪;
}员工;
作废新员工(员工*人,字符*姓名,双倍工资){
person=malloc(sizeof(雇员));
人员->姓名=malloc(strlen(姓名)+1);
strcpy(人员->姓名,姓名);
人员->工资=工资;
printf(“员工:姓名=%s工资=%f\n”,人员->姓名,人员->工资);
}
int main(int argc,char*argv[])
{
员工*bob=0;
新员工(bob,“bob Doe”,1000);
printf(“员工:姓名=%s工资=%f\n”,鲍勃->姓名,鲍勃->工资);
返回0;
}
我不确定出了什么问题,但我可以在new_employee中使用该结构,但当我尝试从main使用它时,它会中断。基本上,第一个printf工作,第二个printf崩溃。我认为main没有更新bob,但是我使用了一个指针,所以它应该通过引用传递。您的问题是
new\u employee()
无法更改main中的bob
指针。您可以使用双指针使其工作。您可以认为指针的意思是通过引用传递结构,但指针值本身仍然是通过值传递的。如果将指针传递给指针,则可以将指针bob
更改回main
但是,我认为更好的解决方案是让new\u employee()
返回指针。然后大体上,您只需将结果分配给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()
失败怎么办?),并且在程序结束之前,您还应该在bob->name
和bob
上使用free()
。如果您分配了大量新员工,但在工作完成后不释放他们,那么您可能会无缘无故地占用大量内存(内存泄漏)
您可以创建一个自由函数,例如:
void free_employee(employee *person) {
free(person->name);
free(person);
}
将您的new_employee函数更改为return person,即
employee*new_employee(…){…return person;}