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

C语言学生成绩统计代码总分输出异常随机大数如何修复?

问题原因

你的代码存在3个核心错误,直接导致总分计算异常:

  • calcTtlMark函数中局部变量i未初始化,是随机垃圾值,你用studs[i]访问的是非法内存地址,求和结果自然是随机大数
  • 调用calcTtlMark时你传入的是单个学生的地址&studs[i],但函数形参设计为数组类型,逻辑不匹配,不需要用下标访问,直接取传入的第一个元素的成绩求和即可
  • main函数中调用displays时传入的&studs[i]参数非法,外层定义的int i未初始化,指向随机内存,只是你运行时运气好刚好碰到了数组首地址才没出现展示异常,属于隐藏BUG

修复方案

1. 修改calcTtlMark函数逻辑

改成直接对传入的单个学生成绩求和:

int calcTtlMark(struct Pelajar* stud)
{
    return stud->subMark.bm + stud->subMark.bi + stud->subMark.math + stud->subMark.sains;
}

2. 修正main函数中displays的传参

直接传数组首地址即可:

displays(studs);

3. 修正calcTtlMark的调用传参

传入单个学生的指针即可:

sum = calcTtlMark(&studs[i]);

可选优化

去掉scanf中数组名前多余的&,符合C语言语法规范,比如scanf("%s", studs[i].studId)。

完整修复后代码

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>


struct Sabjek
{
    int bm;
    int bi;
    int math;
    int sains;
};

struct Pelajar
{
    char studId[10];
    char studName[20];
    char clsRoom[20];
    struct Sabjek subMark;
    int totalMark;
};

void displays(struct Pelajar studs[])
{
    printf("\t\tSTUDENTS INFO");

    for(size_t i=0;i<2;i++)
    {
        printf("\nStudent ID: %s", studs[i].studId);
        printf("\nStudent's name: %s", studs[i].studName);
        printf("\nClassroom: %s", studs[i].clsRoom);
        printf("\nSubject Marks:- ");
        printf("\nBahasa Melayu: %d", studs[i].subMark.bm);
        printf("\nBahasa Inggeris: %d", studs[i].subMark.bi);
        printf("\nMatematik: %d", studs[i].subMark.math);
        printf("\nSains: %d", studs[i].subMark.sains);
        printf("\n---------------------------------\n");
    }
}

int calcTtlMark(struct Pelajar* stud)
{
    return stud->subMark.bm + stud->subMark.bi + stud->subMark.math + stud->subMark.sains;
}

int main()
{
    struct Pelajar studs[2];
    int sum;


    for(size_t i=0;i<2;i++)
    {
        printf("\nStudent ID: ");
        scanf("%s", studs[i].studId);
        printf("\nStudent's name: ");
        scanf("%s", studs[i].studName);
        printf("\nClassroom: ");
        scanf(" %[^\n]s", studs[i].clsRoom);
        printf("\nSubject Marks:- ");
        printf("\nBahasa Melayu: ");
        scanf("%d", &studs[i].subMark.bm);
        printf("\nBahasa Inggeris: ");
        scanf("%d", &studs[i].subMark.bi);
        printf("\nMatematik: ");
        scanf("%d", &studs[i].subMark.math);
        printf("\nSains: ");
        scanf("%d", &studs[i].subMark.sains);
    }

    system("cls");
    displays(studs);

    printf("\t\tSTUDENTS TOTAL MARKS");


    for(size_t i=0;i<2;i++)
    {
        printf("\nTotal marks for student name: %s is ", studs[i].studName);
        sum=calcTtlMark(&studs[i]);
        printf("%d", sum);
        printf("\n---------------------------------\n");
    }

    return 0;
}

修复后运行即可得到你预期的输出结果。

内容的提问来源于stack exchange,提问作者Irfan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:15:04