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

C程序返回-nan错误求助:滑动均值计算异常排查

滑动均值数组代码输出-nan问题排查

问题描述

现有一段C语言代码,意图接收整数数组,生成滑动均值数组:第i位的值为i之前最后n个元素的均值;若i<n,则为i之前所有已有元素的均值。例如n=3时,输入数组1 2 3 4 5 6,对应输出1 1.5 2 3 4 5。但使用gcc编译运行时,控制台连续输出10次-nan,本地及在线编译环境均出现该问题。

问题代码

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

float *
mobMean (int x[], int n, int nval)
{
    int i, j, sum, num;
    float *means;

    if(means=malloc(sizeof(float) * nval))
    {
        for(i=0; i<nval; i++)
        {
            sum=0;
            num=0;
            for(j=i; j>=0 && i-j>=n; j--)
            {
                sum+=x[j];
                num++;
            }
            *(means+i)=(float)sum/num;
        }
    }
    else
        printf("e");
    return means;
}

int
main()
{
    int a[10], i;
    float *b;
    for(i=0; i<10; i++)
        scanf("%d", &a[i]);
    b=mobMean(a,3,10);
    for(i=0; i<10; i++)
        printf("%f", *(b+i));
    free(b);
    return 0;
}

问题排查与修复

核心错误:内层循环条件逻辑完全颠倒

代码中内层循环的条件j>=0 && i-j>=n是错误的:

  • 该条件要求当前元素索引i与j的差值大于等于n,这意味着j的取值范围是j <= i-n,对于所有i < n的情况,i-n是负数,循环根本不会执行,导致sum=0且num=0,0/0的计算结果就是nan。
  • 正确的逻辑应该是i与j的差值小于n,即j>=0 && i-j <n,这样才能取到i之前最多n个元素(当i<n时,取所有已有元素;当i>=n时,取最近n个元素)。

修复后的内层循环代码

for(j=i; j>=0 && i-j <n; j--)
{
    sum+=x[j];
    num++;
}

额外优化点

  • 输出格式优化:原printf("%f", *(b+i))无空格分隔,建议改为printf("%f ", *(b+i)),方便区分结果。
  • 内存分配失败提示:原printf("e")可改为更清晰的提示,比如printf("内存分配失败\n")。

修复后测试

输入1 2 3 4 5 6 7 8 9 10,n=3时,输出应为:
1.000000 1.500000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:55:18