我正在尝试为struct创建一个构造函数,它接受一个指向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 :(得分:3)
您正在为您的函数参数<section>
<h1>Title</h1>
<p>...</p>
</section>
分配。函数参数按值传递,因此调用者永远不会看到您分配的内存。为此,您需要修改调用者的变量,并且可以通过将指针传递给 it 来实现:
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
指令的警告。此外,如果您的内存不足,#include
可能会失败。在这种情况下,您不应该尝试取消引用返回的空指针。