ошибка сегментации во время связанного списка malloc - PullRequest
1 голос
/ 10 мая 2019

Я создал две структуры:

typedef struct Student{
    int id; 
    char* name;
    int birthYear;
    int finishedCourses;
    int courseCredits;
    double avarage;
    int coursesNow;
    NodeCourses* courses;

}Student;

typedef struct NodeS{
    Student student;
    struct NodeS* next;
}NodeS;

Так что теперь я могу создать связанный список студентов.

Одна из вещей, которую я хочу сделать, - попросить пользователя:поместите детали о каждом ученике.

, поэтому я создал функцию, которая называется "addNewStudent"

, сначала в функции, которая делает это:

NodeS* newStudent;
    newStudent=(NodeS*)malloc(sizeof(NodeS));

и затем, когда яПрошу пользователя вставить имя. Я поместил его в строку с именем «name», и я хочу снова выполнить malloc строку имени.поэтому я делаю это:

newStudent->student.name=(char*)malloc(sizeof(char)*strlen(name));

и эта строка вызывает ошибку сегментации.

ps: я проверил, что строка соответствует размеру записи и что я получаю ее правильно.

что мне делать?

1 Ответ

2 голосов
/ 10 мая 2019
 newStudent->student.name=(char*)malloc(sizeof(char)*strlen(name));

Я уверяю вас, что именно эта строка кода вызывает ошибку сегментации.Эта строка кода выполняет три вещи, каждая из которых может быть вашей причиной:

1) Вы делаете strlen(name).Если name не указывает на допустимую строку в стиле C с правильным нулевым завершающим байтом, это может вызвать ошибку.Вы можете проверить эту теорию, добавив ее перед строкой кода:

printf("About to call strlen\n");
printf("Got: %d\n", strlen(name));

Если это проблема, вы увидите первую строку вывода, но не вторую, поскольку segfault прекратит выполнение программы перед ней.получает шанс выполнить.

2) Вы звоните malloc.Возможно, что куча стала поврежденной из-за предыдущего двойного освобождения, использования после освобождения, переполнения буфера или подобной проблемы.Так что вызов malloc может стать жертвой предыдущего урона.Вы можете проверить это, добавив этот код:

printf("About to call strlen\n");
printf("Got: %d\n", strlen(name));
printf("About to call malloc\n");
char *o = malloc(sizeof(char) * strlen(name));
printf("Malloc didn't segfault\n");
newStudent->student.name=o;

3) Вы присваиваете newStudent->student.name.Если, например, newStudent равно NULL или иным образом не указывает на допустимое содержимое, это может быть вашей проблемой.Вы можете проверить это, добавив следующий код:

printf("About to call strlen\n");
printf("Got: %d\n", strlen(name));
printf("About to call malloc\n");
char *o = malloc(sizeof(char) * strlen(name));
printf("Malloc didn't segfault\n");
printf("Trying to access newStudent->student.name\n");
printf("newStudent->student.name=%p\n", newStudent->student.name);
newStudent->student.name=o;
printf("Actually, the whole statement worked\n");

Если вы видите все printf s, но ваша программа все еще дает сбой, то вы ошиблись в утверждении, вызывающем ошибку segfault.

...