在上面的代码中我无法输入学生的名字,因为它给出了空指针赋值错误。如何解决这个问题,我可以输入滚动号,它显示结果就好了
#include<stdio.h>
#include<conio.h>
union student
{
int roll_no;
char name[10];
}s1,*a;
void main()
{
clrscr();
*a=s1;
printf("Enter roll_no : ");
scanf("%d",a->roll_no);
clrscr();
printf("Roll No : %d",a->roll_no);
getch();
clrscr();
printf("Enter name : ");
scanf("%s",a->name);
clrscr();
printf("Name : %s",a->name);
getch();
}
答案 0 :(得分:4)
*a=s1;
将此更改为 -
a=&s1;
这句话 -
scanf("%d",a->roll_no); // %d expects address of int variable
应该是 -
scanf("%d",&a->roll_no);
注意 - - void main()
- &gt; int main(void)
或int main(int argc, char **argv)
答案 1 :(得分:2)
该行
*a = s1;
将s1
复制到内存a
指向的内容,尽管您没有分配任何内存。
我认为您的实际意图是加载a
,地址为s1
:
a = &s1;
您需要向scanf
提供对象的地址,以便从stdin
读取:
scanf("%d",&a->roll_no);
该行
scanf("%s",a->name);
可能导致缓冲区溢出,因为它读取任何字符串,无论长度如何。写
scanf("%9s", a->name);
为了安全或更好,请使用fgets
。
void main()
不是main
的严格一致定义。如果您的系统允许,则可以,但不应该是int main()
或int main(int argc, char** argv)
。