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

使用GDB调试正常但VSCode异常:C语言正数平均值计算结果过小

C语言计算正数平均值结果异常的修复

问题描述

以下代码用于计算数组中正数的平均值,在GDB调试中运行正常,但在VSCode中运行时结果数值过小:

#include <stdio.h>
#define size 100
int main(){
    int peppe[size],n,i,j;
    float somma;

    do {
        printf("Inserisci il numero di elementi: ");
        scanf("%d", &n);
    } while (n <= 0 || n > size);

    for(i=0; i<n; i++) {
        printf("Inserisci il valore %d: ", i);
        scanf("%d", &peppe[i]);
    }

    for(i=0; i<n; i++){
        if(peppe[i]>=0){
            somma += peppe[i];
            j++;
        }
    }

    printf( "La media dei valori positivi è: %.2lf", somma/j );

    return 0;
}

VSCode运行输出示例:

Inserisci il numero di elementi: 5
Inserisci il valore 0: 3
Inserisci il valore 1: 4
Inserisci il valore 2: 5
Inserisci il valore 3: -8
Inserisci il valore 4: -7
La media dei valori positivi è: 1.09

问题根源

代码存在未定义行为:局部变量somma和j没有初始化。C语言中,栈上的局部变量默认不会被初始化为0,会保留栈空间中的随机垃圾值。

  • GDB调试时,栈空间可能被调试环境清零,恰好somma和j的初始值为0,所以计算结果正确;
  • VSCode的编译运行环境中,这两个变量的初始值是随机的小数值,导致累加后的somma依旧很小,除以随机的j值后得到错误的偏小结果。

修复后的代码

只需将somma和j初始化为0,同时添加无正数时的异常处理:

#include <stdio.h>
#define size 100
int main(){
    int peppe[size],n,i,j = 0; // 初始化计数变量j为0
    float somma = 0.0f; // 初始化累加变量somma为0.0f

    do {
        printf("Inserisci il numero di elementi: ");
        scanf("%d", &n);
    } while (n <= 0 || n > size);

    for(i=0; i<n; i++) {
        printf("Inserisci il valore %d: ", i);
        scanf("%d", &peppe[i]);
    }

    for(i=0; i<n; i++){
        if(peppe[i]>=0){
            somma += peppe[i];
            j++;
        }
    }

    // 处理无正数的情况,避免除以0错误
    if(j == 0){
        printf("Non ci sono valori positivi.\n");
    } else {
        printf( "La media dei valori positivi è: %.2lf", somma/j );
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:48:29