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.