我创建了两个结构:
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));
这条线给了我分割错误。
附言:
我检查了字符串的写大小,我得到的是正确的。
我该怎么办?
最佳答案
newStudent->student.name=(char*)malloc(sizeof(char)*strlen(name));
我相信这一行代码会导致分段错误。这一行代码有三个功能,任何一个都可能是您的原因:
1)你确实
strlen(name)
。如果name
没有指向具有正确nul终止字节的有效C样式字符串,则这可能会导致segfault。您可以通过在代码行之前添加以下内容来测试此理论: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的语句。关于c - malloc链表时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56081390/