Проблемы с массивом указателей на структуру - PullRequest
0 голосов
/ 18 мая 2019

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

int main(void) 
{
    student* students[NUMBER_OF_STUDENTS];

    strcpy(students[0]->name, "test");
    strcpy(students[0]->surname, "test");
    students[0]->grade = 18;

    return EXIT_SUCCESS;
}

Моя проблема в том, что этот простой фрагмент кода возвращает -1 в качестве состояния выхода после выполнения. Почему это так?

Ответы [ 3 ]

3 голосов
/ 18 мая 2019

Потому что это UB.У вас есть только указатель без выделенных фактических структур.

students[x] = malloc(sizeof(*students[0]));

или статически

student s;
students[x] = &s;

или

 students[x] = &(student){.name = "test", .surname ="test", .grade = 18};
3 голосов
/ 18 мая 2019

Указатель students[0] неинициализирован. Разыменование приводит к неопределенному поведению.

Инициализируйте его адресом действительного объекта, прежде чем пытаться получить к нему доступ.

student test;
students[0] = &test;

strcpy(students[0]->name, "test");
strcpy(students[0]->surname, "test");
students[0]->grade = 18;
1 голос
/ 18 мая 2019

Указатели указывают на никуда, поскольку вы не выделили для них памяти для указания.

int main(void) 
{
    student* students = (student*)malloc(sizeof(student)*[NUMBER_OF_STUDENTS]); \\malloc dynamically allocate heap memory during runtime

strcpy(students[0]->name, "test");
strcpy(students[0]->surname, "test");
students[0]->grade = 18;

return EXIT_SUCCESS;

}

* Примечание Редактировать marko -- Строго говоря, указатели указывают на то, что было последним в расположении стека, или регистрируют, удерживая его - это может быть ничто или то, что вас действительно волнует.Радости UB

...