2017-10-15 135 views
0

我想爲struct,mallocs的內存,並設置字段的指針作出結構的構造函數。但是,當我打印我相信我已經設置的內容時,我看到這些字段是空的。我也使用C99結構指針設置值

void init_student(struct student* student, char* name, int id, float gpa) { 
    student = (struct student*) malloc(sizeof(struct student)); 
    student->name = name; 
    student->id = id; 
    student->gpa = gpa; 
} 
+0

您正在覆蓋'student',而不是修改它。 –

+0

這是不夠的代碼來知道你在做什麼。你給這個函數的參數是什麼?你如何使用我返回的結構?最好使[mcve] –

回答

3

您正在分配到student,您的函數參數。函數參數是按值傳遞的,所以調用者永遠不會看到你分配的內存。對於這一點,你需要的呼叫者的變量進行修改,並且你可以通過指針實現,要

void init_student(struct student** student, char* name, int id, float gpa) { 
    *student = malloc(sizeof(struct student)); 
    ... 
} 

和或者稱其爲

struct student* student; 
init_student(&student, ...); 

,使指針返回值:

struct student* new_student(char* name, int id, float gpa) { 
    struct student* student = malloc(sizeof(struct student)); 
    ... 
    return student; 
} 

然後

struct student* student = new_student(...); 

順便說一句,你不需要投malloc的結果,而這樣做在C通常氣餒,因爲它可能隱藏了有關失蹤#include指令警告。另外,如果內存不足,malloc可能會失敗。在這種情況下,您不應該嘗試解引用返回的空指針。

+1

..或者只是將函數的指針返回給分配的內存。 – haccks

+0

@haccks事實上,我只是在您發表評論時對其進行編輯。 :) – hvd