2015-11-11 204 views
0

有點幫助嗎? 我很確定答案一定是愚蠢的,但我不明白爲什麼我的scanf後會出現分段錯誤。我在我的代碼一直盯着現在很長一段時間: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

嘗試'scanf函數(「%s」,actual.grade)'而不是 –

+0

您在初始化時將init的值設置爲NULL。 – bruceg

+0

爲什麼在初始化後將init設置爲null,返回NULL ... – t0mm13b

回答

2

首先,你分配內存init

init = (student*)malloc(sizeof(student)); 

但你立即成立init在這裏您initialize()函數的返回值設置爲NULL

init = initialize(); 

這不僅是內存泄漏,但你接下來將actual設置爲NULL

actual = init; 

再後來在while循環取消引用actual(這是NULL)在幾個地方,如這裏

scanf("%d", &actual->grade); 

取消引用空指針是未定義的行爲,這是你的錯誤的一個可能的來源。

+1

謝謝!我看到你應該在一個教程中初始化你的結構爲null,我想我是按錯誤的順序做的。Noobs對不對?哈哈 對於愚蠢的問題,我很抱歉,你們是最棒的! –

+0

你應該知道,許多'教程'充滿了垃圾。將指針置零/無論在加載另一個指針之前,有效值都是毫無意義的(無指針?),最好的情況是,最壞的情況下容易出錯。與I/O緩衝區的貨運信息「bzero/memset」一樣。 –

0

您的initialize()函數返回null,並且您正在創建內存泄漏。而不是返回null將數據成員初始化爲合理的值。 「

0

」謝謝!我看到你應該在一個教程中將你的結構初始化爲null,我想我是在錯誤的順序上做的。Noobs對不對?哈哈對於這個愚蠢的問題感到抱歉,你們是最好「

你是對的,你應該初始化爲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));