You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:22:43