程序返回垃圾值

时间:2014-02-13 11:59:23

标签: c garbage

此程序返回总标记和平均标记输出中的垃圾值。 即使在程序开头

中声明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();
}

3 个答案:

答案 0 :(得分:2)

这是非法的内存访问:s.marks[15]=0

如果数组中有15个条目,则合法索引介于0和14之间。

所以你可以s.marks[0]=0s.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与数组时一直不一致。