我在头文件中创建了一个结构来存储学生信息。我在名为createStudent()的函数中初始化这些成员变量。 createStudent()函数返回一个指向新初始化的学生的指针。现在,当我测试这一切正常时,我得到了一些意外的结果。
该代码会编译并运行,但是,只有对学生信息的首次访问会返回有用的值。在下面的代码中,我首先打印出学生的年龄,并且我得到正确的年龄,但是gpa和num值是垃圾值。但是,如果我注释掉了针对学生年龄的打印语句,则gpa值正确,而num值仍然是垃圾。似乎只有第一次访问会返回goof值。现在我可以肯定地说这是我的指针和内存分配的问题,我只是不知道问题出在哪里。
我最初认为是在第一次访问后释放了内存(我不知道为什么会发生这种情况,但似乎正在发生)。因此,我尝试使用malloc来确保始终有可用的内存来存储学生信息,但是结果没有改变。
我还尝试在分配gpa和num后在createStudent()函数中重新分配age,但是age仍然可以得到校正后的值,并且gpa和num具有垃圾值。
如果您需要有关此的更多信息,请告诉我。
typedef struct Students{
int num; //holds the students number
char name[256]; //holds the students name
int age; //holds the students age
int gpa; //holds the students grade point average
}Student;
Student * createStudent();
Student * createStudent(){
Student newStud;
Student *studPtr;
newStud.age = 10;
newStud.gpa = 5;
newStud.num = 307234;
studPtr = &newStud;
return studPtr;
}
int main(int argc, char *argv[]){
int retCode = 0;
Student *stdPtr = createStudent();
printf("The students age is: %d\n", stdPtr->age);
printf("The students gpa is: %d\n", stdPtr->gpa);
printf("The students number is: %d\n", stdPtr->num);
return retCode;
}
答案 0 :(得分:3)
如注释中所述,为Student newStud
分配的内存仅在调用您的函数时才有效。返回后,内存将再次释放。
如果要返回已创建结构的地址,则必须自己分配内存:
Student * createStudent(){
Student *studPtr = malloc(sizeof(Student));
studPtr->age = 10;
studPtr->gpa = 5;
studPtr->num = 307234;
return studPtr;
}
不要忘记free
分配的内存。