如何使用指针访问结构成员

时间:2019-04-25 19:41:26

标签: c pointers

我在头文件中创建了一个结构来存储学生信息。我在名为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;
    }

1 个答案:

答案 0 :(得分:3)

如注释中所述,为Student newStud分配的内存仅在调用您的函数时才有效。返回后,内存将再次释放。

如果要返回已创建结构的地址,则必须自己分配内存:

Student * createStudent(){
     Student *studPtr = malloc(sizeof(Student));

     studPtr->age = 10;
     studPtr->gpa = 5;
     studPtr->num = 307234;

     return studPtr;
}

不要忘记free分配的内存。