Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C通过引用(指针)传递崩溃_C - Fatal编程技术网

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;}