scanf处的指针分段错误

时间:2015-11-11 22:53:51

标签: c pointers memory segmentation-fault

一点帮助? 我很确定答案肯定是愚蠢的,但我不明白为什么我在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)

任何想法?

3 个答案:

答案 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));