if (max_score temp=max_score; max_score=stu[i].score[j]; stu[i].score[j]=temp; p=i; } 你一段 是想做什么? 而且,在你的源代码中,这一段是错误的,此时的stu[i].score[j]是一个随机数!j==3,越界了! 而且,你所说 的错误,就是上面这一段代码引起的,此时的stu[i].score[j]实际上就是stu.aver,所以,执行的时候,将 max_score的初始值 : 0 赋值给stu.aver了,所以,你看到的第一个人的aver是0 这个是我根据猜测你的 意图,修改出来的, #include struct student { int num; char name[10]; float score[3]; float aver; }stu[5]; int main() { int i,j,max_score=0,p; float sum,temp; for (i=0;i<5;i++) { sum=0; printf("Input %d student information\n",i+1); printf("NO.:"); scanf("%d",&stu[i].num); printf("name:"); scanf("%s",&stu[i].name); for (j=0;j<3;j++) { printf("%d course score:",j+1); scanf("%f",&stu[i].score[j]); sum=sum+stu[i].score[j]; if (max_score /*temp=max_score;*/ max_score=stu[i].score[j]; /*stu[i].score[j]=temp;*/ p=i; } } stu[i].aver=sum/3.0; printf("%-8.2f\n",stu[i].aver); /* if (max_score temp=max_score; max_score=stu[i].score[j]; stu[i].score[j]=temp; p=i; }*/ } printf("\n"); printf("%-3d\t%-3s\t%-6.2f\t",stu[p].num,stu[p].name,stu[p].aver); for (j=0;j<3;j++) printf("%-3.0f\t",stu[p].score[j]); printf("\n"); printf("NO.\tname\tscore1\tscore2\tscore3\taver\n"); for (i=0;i<5;i++) { printf("%-3d\t%-3s\t",stu[i].num,stu[i].name); for (j=0;j<3;j++) printf("%-3.0f\t",stu[i].score[j]); printf("%4.2f\t",stu[i].aver); printf("\n"); } return 0; } 这里是运行截图: