2016-09-20 14 views
1

をクラッシュ: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で構造体を使用することができますが、私はそれを使用しようとすると、それが壊れますメインから基本的に最初のprintfが動作し、2番目のprintfがクラッシュします。私はメインがボブを更新していないと思うが、私はポインタを使用しているので、参照渡しする必要があります。

+0

変更者、すなわち '従業員* new_employee(...){...戻り者を返すようにnew_employee機能。 } ' –

答えて

3

new_employee()は、メインのbobポインタを変更できません。ダブルポインタを使用することで、動作させることができます。ポインタは、構造体を参照渡ししていると考えることができますが、ポインタ値自体は引き続き値渡しされます。ポインタへのポインタを渡すと、bobポインタをメインに戻すことができます。

しかし、もっと良い解決策は、new_employee()がポインタを返すことです。その後、メインでは結果をボブに割り当てます。

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->namebobfree()を使用する必要があります。このように。多くの新入社員を割り当てて、完了したらfree()しないと、何も理由なく(メモリリーク)大量のメモリを使い切る可能性があります。あなたのようなフリー機能を作ることができ

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