2016-09-20 91 views
1

我有這樣的代碼:ç引用傳遞(指針)崩潰

#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使用結構,但是當我嘗試使用它它打破從主要。基本上第一個printf工作在第二個崩潰。我認爲主要是沒有得到鮑勃更新,但我使用了一個指針,所以它應該通過引用。

+0

改變你的new_employee函數返回的人,即員工'* new_employee(...){...回報的人; }' –

回答

3

你的問題是,new_employee()不能改變bob指針在主。你可以通過使用雙指針來使它工作。你可以想象指針是指你通過引用傳遞結構,但指針值本身仍然是按值傳遞的。如果將指針傳遞給指針,則可以將指針bob重新更改爲主。

但是,我認爲更好的解決方案是讓new_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->namebob程序結束之前,應使用free()。如果你分配了大量的新員工,而且他們沒有完成,你可以無故耗盡大量內存(內存泄漏)。

你可以做一個免費的功能,如:

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