[英]Simple structure with dynamic memory allocation
掃描第二個元素后,程序立即崩潰。 它無法進行第三個元素(即等級)的掃描。 需要幫助,找出我錯在哪里錯。
#include<stdio.h>
#include<stdlib.h>
#define NUM 2
typedef struct STUDENT
{
int ID;
char *name;
char *grade;
};
int main ()
{
int i;
struct STUDENT *s;
s = (struct STUDENT*)malloc(NUM*sizeof(struct STUDENT*));
printf("Enter Student's ID, Name and Grade:\n");
for(i=0;i<NUM;i++)
{
printf("Enter ID:\n");
scanf("%d", &(s+i)->ID);
printf("Enter Student Name:\n");
scanf("%s", (s+i)->name);
printf("Enter Grade:\n");
scanf("%s", (s+i)->grade);
printf("\n");
}
printf("\nInformation of the student's are:\n");
for(i=0;i<NUM;i++)
{
printf("Student ID = %d\n", (s+i)->ID);
printf("Student Name = %s\n", &(s+i)->name);
printf("Student grade = %c\n", &(s+i)->grade);
printf("\n");
}
return 0;
}
malloc(NUM*sizeof(struct STUDENT*));
應該
malloc(NUM*sizeof(struct STUDENT));
同樣, name
和grade
也不是緩沖區,而是指針。 您可能需要緩沖區(字符數組)或為其動態分配內存。
您不為struct STUDENT
grade
和name
分配內存。 嘗試讀取輸入並將其寫入它們會產生未定義的行為。
添加必要的malloc
,例如具有給定的最大長度STR_MAX
:
s[i].name = malloc(STR_MAX);
s[i].grade = malloc(STR_MAX);
有關其他錯誤,請參見其他答案。
struct STUDENT *s;
應該這樣聲明:
STUDENT *s;
無需從malloc
轉換void *
。 更改此行s = (struct STUDENT*)malloc(NUM*sizeof(struct STUDENT*));
對此:
s = malloc(NUM * sizeof(*s));
代替此scanf("%d", &(s+i)->ID);
,以下內容可能更容易理解:
scanf("%d", &s[i].ID);
同樣在這里:
printf("Student ID = %d\\n", s[i].ID);
最重要的是,納布拉說了什么。
typedef struct STUDENT
{
int ID;
char *name;
char *grade;
};
這里是名稱和等級字符類型的指針。 因此,當您使用malloc結構時,您也必須同時分配名稱和等級
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.