#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 имела действительный возраст.