Значение структуры изменяется после обращения к ней дважды

#function #pointers #struct

#функция #указатели #структура

Вопрос:

Когда я пытаюсь получить доступ к элементу age из моей структуры (используя функцию, которая принимает двойной указатель), я получаю правильное значение только с первой попытки. Почему оно меняется? Перемещается ли указатель?

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct student {
    int age; 
    char name[200];
} student;


int getAge(student **s){
    int a = (*s)->age;
    return a;
}

student *create(){
    student st;
    student *mp = amp;st;
    st.age = 25;
    
    return mp;
}

int main()
{
    student *sp = create();
    int myAge = getAge(amp;sp);    
    printf("I am %dn", myAge);
    int Age = getAge(amp;sp);
    printf("Again, I am %dn", Age);
    
    return 0;
}
  

Ответ №1:

Я думаю, я вижу, в чем проблема. Ваша create() функция создает ученика в стеке и устанавливает mp , чтобы указать на него. Когда create() функция возвращается (или, возможно, некоторое время спустя), mp указывает в никуда, в частности, поскольку фрейм стека, на который она указывала, был уничтожен.

Пожалуйста, попробуйте использовать malloc для создания ученика в вашей create функции:

 student *mp = malloc(sizeof student);
  

Или, если это код C :

 student *mp = new student;
  

Не забудьте free (если C) или delete (C ) sp в вашей main функции, когда вы закончите с ней, чтобы избежать утечки памяти.

Комментарии:

1. Спасибо за помощь, Натан. К сожалению, он по-прежнему возвращает 10-значное число во второй раз. Я изменил функцию create() на следующую:

2. student *create(){ student st; st.age = 25; student *mp = malloc(sizeof(student)); mp = amp;st; //student *mp = amp;st; return mp; }

3. Это сработает, если вы удалите mp = amp;st; строку? Также используйте mp->age вместо st.age , иначе возраст будет равен 0.

4. Удаление mp = amp;st приводит к возрасту = 0 для обоих запросов. Это исправляет ошибку недопустимого указателя, которую я получал при использовании free (sp).

5. Убедитесь, что оно установлено mp->age = 25 после вызова malloc , чтобы возвращаемая структура student имела действительный возраст.