malloc链表时出现分段错误

时间:2019-05-10 16:18:06

标签: c segmentation-fault

我创建了两个结构:

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: 我已经检查了字符串是否处于写入大小,并且我得到的是正确的。

我该怎么办?

1 个答案:

答案 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。例如,如果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");

如果看到所有printf,但程序仍然崩溃,则说明导致段错误的语句是错误的。