我创建了两个结构:
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”的字符串中,并且我想再次分配该名称字符串。 所以我这样做:
newStudent->student.name=(char*)malloc(sizeof(char)*strlen(name));
那一行给我分割错误。
ps: 我已经检查了字符串是否处于写入大小,并且我得到的是正确的。
我该怎么办?
答案 0 :(得分:2)
newStudent->student.name=(char*)malloc(sizeof(char)*strlen(name));
我相信您,这段确切的代码会导致分段错误。此行代码可以完成三件事,其中任何一项都可能是您的原因:
1)您执行strlen(name)
。如果name
没有指向带有正确nul终止字节的有效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
,但程序仍然崩溃,则说明导致段错误的语句是错误的。