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

数组传参求平均分结果每次运行变化的问题排查

数组指针传参计算平均分sum值异常排查

问题描述

我正在学习数组通过指针传参至函数的知识(将数组基地址传递给函数参数指针,通过指针算术提取整个数组)。为练习,我需要计算70名学生的平均分:学生分数从40开始依次递增1,存储在名为marks的数组中,要求通过指针参数的函数实现计算。但编写代码后每次运行时sum值都会变化,请求排查错误。

原代码

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

float average(int *b)
{
    int sum = 0;
    for (int i = 1; i <= 70; i++)
    {
        sum = sum + *b;
        b = b + 1;
    }
    printf("the value of sum is %d\n", sum); // 这个值每次运行都变
    return (((float)sum) / 70);
}

int main()
{
    int marks[70];
    marks[0] = 40;

    for (int i = 0; i < 68; i++)
    {
        marks[i + 1] = marks[i] + 1;
    }

    printf("the value of marks of 10th child is %d\n", marks[9]); // 验证正确,输出49
    printf("the value of average marks of the class is %f\n", average(&marks[0]));

    return 0;
}

错误原因

核心问题是数组未完全初始化:

  • marks数组包含70个元素,但main函数里的初始化循环条件是i < 68,仅初始化了marks[0]到marks[68](共69个元素),最后一个元素marks[69]未被赋值,属于栈上的未初始化变量,其值是随机的。
  • average函数的循环会遍历70个元素,最后一次访问的正是未初始化的marks[69],这个随机值导致每次运行sum的结果都不一样。

修正方案

将main函数中的初始化循环条件改为i < 69,确保所有70个元素都被初始化:

for (int i = 0; i < 69; i++)
{
    marks[i + 1] = marks[i] + 1;
}

额外优化

  • 代码中并未用到math.h、stdlib.h、time.h,可以移除这些多余的头文件,减少编译依赖。
  • average函数的循环可以从i=0开始到i<70,逻辑更直观,效果和原循环一致。

修正后,sum的固定值应为(40 + 109) * 70 / 2 = 5215,平均分约为74.5。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:40:32