一点帮助? 我很确定答案肯定是愚蠢的,但我不明白为什么我在scanf之后就出现了分段错误。我很长一段时间一直盯着我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Student{
int grade, id;
struct Student *next;
}student;
student *initialize(){
return NULL;
}
int main(){
student *init;
student *nxt;
student *actual;
int resp;
init = (student*)malloc(sizeof(student));
init = initialize();
actual = init;
while(1){
printf("type grade:\n");
scanf("%d", &actual->grade);
printf("type id:\n");
scanf("%d", &actual->id);
printf("wanna continue? (1-YES e <other>-NO)\n");
if(resp==1){
actual->next=(student*)malloc(sizeof(student));
nxt=actual->next;
}else
break;
}
actual->next=NULL;
return 0;
}
没什么大不了的吧?有一个结构,我想扫描一个值。在我的终端上,我得到:
type grade:
3
Segmentation fault (core dumped)
任何想法?
答案 0 :(得分:2)
首先为init
init = (student*)malloc(sizeof(student));
但您立即将init
设置为NULL,并在此处使用initialize()
函数的返回值
init = initialize();
这不仅是内存泄漏,而且您接下来将actual
设置为NULL
actual = init;
然后在你的while循环中你在几个地方取消引用actual
(这是NULL),例如这里
scanf("%d", &actual->grade);
取消引用NULL指针是未定义的行为,这可能是您的错误的来源。
答案 1 :(得分:0)
您的initialize()函数返回null并且您正在创建内存泄漏。而不是返回null将数据成员初始化为合理的值。
答案 2 :(得分:0)
&#34;谢谢!我看到你应该在教程中将你的结构初始化为null,我想我是在错误的顺序上做的.. Noobs对吗?哈哈我对这个愚蠢的问题感到抱歉,你们是最好的&#34;
你是对的,你应该初始化为null。但是你所拥有的代码并没有这样做。
你需要这样做
student *initialize(student * st)
{
st->id = 0;
st->grade = 0;
st->next = NULL;
return st;
}
或使用calloc而不是malloc来创建学生对象(calloc将memry清除为0)
或做
init = malloc ...
memset(init, 0, sizeof(student));