gpt4 book ai didi

c - malloc 链表时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:09 25 4
gpt4 key购买 nike

我创建了两个结构:

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 样式字符串,则可能会出现段错误。您可以通过在代码行之前添加以下内容来测试该理论:

printf("About to call strlen\n");
printf("Got: %d\n", strlen(name));

如果这是问题所在,您将看到第一行输出而不是第二行,因为段错误会在程序有机会执行之前终止它。

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 但您的程序仍然崩溃,那么您对导致段错误的语句是错误的。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com