Проблема здесь в том, что вы возвращаете структурную переменную (pointer_x
), которая размещена локально в стеке внутренней функции details_pointer()
, но эта память больше не резервируется для вас, как только она возвращается. Это означает, что вы получаете (в лучшем случае) мусор.
Вы должны либо выделить память в функции и вернуть ее (и не забудьте освободить ее!) Или передать данные в функциюзаполните его.
void get_details(int n, struct details p[n])
{
for (int i = 0; i < n; i++)
{
// do stuff with p[i]
}
}
int main()
{
...
scanf("%d", &n);
struct details students[n];
get_details(n, students);
printf("\nName: %s\n", students[0].name);
...
}
Я обычно предпочитаю передавать данные в функцию, когда это возможно, просто потому, что она упрощает управление памятью.
РЕДАКТИРОВАТЬ: Два замечания о вашем существующем details_pointer()
функция.
1) В fgets(pointer[i].name, 100, stdin)
рекомендуется вывести число байтов из размера массива, если он известен;в этом случае это так, поэтому рекомендуем fgets(pointer[i].name, sizeof(pointer[i].name), stdin)
. Ваш не является неправильным, но легче поддерживать, если размеры изменятся в будущем.
2) scanf("%d", pointer[i].age)
должен взять адрес .age
, чтобы заполнить его значениетам;вы передаете номер вместо адреса, что, безусловно, неверно.