C语言结构体循环输入数据为何未被覆盖?新手技术疑问
问题分析与修正
首先明确你的核心疑问:不仅会出现数据覆盖,还会触发数组越界的未定义行为,问题出在结构体设计、循环逻辑和输入输出的多处错误上,具体拆解如下:
1. 结构体设计错误
你定义的struct Student里只有单个int mark,这意味着每个学生只能存储1门课程的成绩,完全无法满足“每个学生3门课”的需求。必须把mark改成数组,才能容纳多门课成绩:
struct Student { int mark[3]; // 每个学生存3门课成绩 };
2. 循环逻辑错误
你的双层循环中,外层i是学生索引(0和1,对应2个学生),但内层循环完全没用到i,反而用j去访问st[j]——当j=2时,st[2]超出了st[2]数组的合法范围(合法索引是0和1),这属于数组越界访问,会破坏内存中其他数据,同时每个学生的成绩根本没被正确存储到对应的结构体变量里。
正确的逻辑应该是:外层循环遍历学生(i从0到1),内层循环遍历该学生的3门课(j从0到2),把成绩存入st[i].mark[j]。
3. 输入输出格式错误
scanf用了%f格式符,但mark是int类型,应该用%d;printf缺少输出格式符,而且拼写错误(st[j].marks应该是st[i].mark[j]),无法正确打印成绩。
修正后的完整代码
#include <stdio.h> // 定义学生结构体,每个学生包含3门课成绩 struct Student { int mark[3]; }; int main() { struct Student st[2]; // 存储2个学生的信息 // 输入2名学生各3门课成绩 for (int i = 0; i < 2; ++i) { printf("请输入第%d名学生的3门课成绩:\n", i + 1); for (int j = 0; j < 3; j++) { printf("第%d门课成绩:", j + 1); scanf("%d", &st[i].mark[j]); } } // 输出所有学生成绩 printf("\n所有学生成绩如下:\n"); for (int i = 0; i < 2; ++i) { printf("第%d名学生的成绩:", i + 1); for (int j = 0; j < 3; j++) { printf("%d ", st[i].mark[j]); } printf("\n"); } return 0; }
关于数据覆盖的补充说明
修正后,每个学生的3门课成绩都会存在各自结构体的mark数组中,不会出现覆盖问题——比如第1名学生的3个成绩存在st[0].mark[0]、st[0].mark[1]、st[0].mark[2],第2名学生的存在st[1].mark[0]到st[1].mark[2],6个成绩各有独立的内存位置,互不干扰。
内容的提问来源于stack exchange,提问作者Alsiro Mira
相关产品推荐
相关产品推荐

