簡體   English   中英

scanf處的指針分割錯誤

[英]pointer segmentation fault at 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)

有任何想法嗎?

首先,您為init分配內存

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

但是您立即使用initialize()函數的返回值將init設置為NULL

init = initialize();

這不僅是內存泄漏,而且您接下來在此處actual設置為NULL

actual = init; 

然后,在稍后的while循環中,您在多個位置(例如此處)取消引用actual (為NULL)

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

取消引用NULL指針是未定義的行為,這可能是錯誤的來源。

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

“謝謝!我看到您應該在教程中將結構初始化為null,我想我是按錯誤的順序將其初始化的。.菜鳥嗎?哈哈,我對這個愚蠢的問題感到抱歉,你們是最好的”

您是正確的,應將其初始化為null。 但是您擁有的代碼無法做到這一點。

你需要這樣做

student *initialize(student * st)
{
   st->id = 0;
   st->grade = 0;
   st->next = NULL;
   return st;
}

或者使用calloc而不是malloc來創建一個學生對象(calloc將內存清除為0)

或做

init = malloc ...
memset(init, 0, sizeof(student));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM