扫描完第二个元素后,程序崩溃了。它无法扫描第三个元素(即等级)。需要帮助,弄清楚我错了什么。
#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;
}
答案 0 :(得分:3)
malloc(NUM*sizeof(struct STUDENT*));
应该是
malloc(NUM*sizeof(struct STUDENT));
此外,name
和grade
不是缓冲区而是指针。您可能需要一个缓冲区(char数组)或动态分配内存。
答案 1 :(得分:3)
您不会在grade
中为name
和struct STUDENT
分配内存。尝试读取输入并将其写入它们会产生未定义的行为。
添加必要的malloc
,例如,给定的最大长度STR_MAX
:
s[i].name = malloc(STR_MAX);
s[i].grade = malloc(STR_MAX);
有关更多错误,请参阅其他答案。
答案 2 :(得分:2)
struct STUDENT *s;
应该像这样声明:
STUDENT *s;
无需从void *
投射malloc
。将此行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);
最重要的是,纳布拉所说的。
答案 3 :(得分:1)
typedef struct STUDENT
{
int ID;
char *name;
char *grade;
};
这里是名称和等级字符类型指针。因此,当你使用malloc结构时,你也必须使用malloc名称和等级