Как получить доступ к членам структуры с помощью указателей - PullRequest
0 голосов
/ 25 апреля 2019

Я создал структуру в заголовочном файле для хранения информации об ученике. Я инициализирую эти переменные-члены в функции с именем createStudent (). Функция createStudent () возвращает указатель на недавно инициализированного студента. Теперь, когда я проверяю, что все это работает, я получаю неожиданные результаты.

Код компилируется и запускается, однако только первый доступ к информации об учениках возвращает полезные значения. В приведенном ниже коде я сначала распечатываю возраст учащихся и получаю правильный возраст, но значения gpa и num являются значениями мусора. Однако, если я закомментирую оператор печати для возраста учащихся, значение gpa будет правильным, а значение num по-прежнему будет мусором. Кажется, что только первый доступ возвращает глупые значения. Теперь я совершенно уверен, что это проблема, связанная с моими указателями и распределением памяти, я просто не знаю, в чем проблема.

Сначала я думал, что память освобождается после первого доступа (я не знаю, почему это произошло, но то, что, казалось, происходило). Поэтому я попытался использовать malloc, чтобы обеспечить постоянную доступность памяти для хранения информации об учениках, но результаты не изменились.

Я также пытался переназначить возраст в функции createStudent () после того, как gpa и num были назначены, но возраст все еще получает исправленное значение, а 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 Ответ

3 голосов
/ 25 апреля 2019

Как упоминалось в комментариях, выделенная память для Student newStud живет только до тех пор, пока вызывается ваша функция.как только он возвращается, память снова освобождается.

Если вы хотите вернуть адрес созданной структуры, вы должны выделить память самостоятельно:

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

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

     return studPtr;
}

Незабудьте free выделенную память и проверьте возвращаемое значение malloc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...