此程序返回总标记和平均标记输出中的垃圾值。 即使在程序开头
中声明s.total = 0和s.marks [15] = 0之后//student database
#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{
struct student
{
int name[20];
int roll[5];
int total;
float avg;
int marks[15];
};
struct student s;
int subject_no,i;
s.total=0;
s.marks[15]=0;
printf("Enter the name of student:\t");
scanf("%s",s.name);
printf("enter the roll no:\t");
scanf("%d",&s.roll);
printf("Enter the number of subjects:\t");
scanf("%d",&subject_no);
for(i=0;i<subject_no;i++)
{
printf("Enter marks in subject %d:\t",i);
scanf("%d",&s.marks);
s.total=s.total+s.marks[i];
}
printf("total marks are:%d\n",s.total);
s.avg=(s.total)/(subject_no);
printf("The average is :%d",s.avg);
getch();
}
答案 0 :(得分:2)
这是非法的内存访问:s.marks[15]=0
。
如果数组中有15个条目,则合法索引介于0和14之间。
所以你可以s.marks[0]=0
或s.marks[6]=0
,但不应执行s.marks[15]=0
。
如果要将整个数组设置为零值,则可以迭代它:
for (i=0; i<sizeof(s.marks)/sizeof(*s.marks); i++)
s.marks[i] = 0;
或者只使用memset
:
memset(s.marks,0,sizeof(s.marks));
答案 1 :(得分:1)
您应该使用
明确清除s
结构
memset (&s, 0, sizeof(s));
当然,您填写的s.marks[15]
超出范围(undefined behavior和/或buffer overflow !!)
您的代码永远不会填充或使用s.roll[1]
,那么为什么要将s.roll
作为数组?
最后,您的第一个for
循环应为
if (subject_no >= 15) exit(EXIT_FAILURE);
for(i=0;i<subject_no;i++) {
printf("Enter marks in subject %d:\t",i);
scanf("%d",&s.marks[i]);
s.total=s.total+s.marks[i];
}
答案 2 :(得分:0)
最好将名称存储在char数组中,而不是int数组(尽管可以使用)
此外,您在使用scanf与数组时一直不一致。