我创建了两个结构:

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。例如,如果newStudentNULL或者没有指向有效的内容,那可能是您的问题。您可以通过添加以下代码来测试:
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");

如果您看到所有的printfs,但是您的程序仍然崩溃,那么您就错了导致segfault的语句。

关于c - malloc链表时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56081390/

10-15 16:45