[英]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.