下面的C代码有什么问题?(一个小问题)

brccelvz  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(132)

当你运行下面的C代码时,你几乎每次都会得到不同的结果(没有一个是完全正确的)。

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

int main()
{
    int i,j;
    int s[10][4]={{202201,90,13,21},{202202,32,24,12},{202203,23,53,76},{202204,21,43,64},{202205,12,45,89},{202206,98,99,100},{202207,12,0,0},{202208,0,0,0},{202209,98,12,34},{202210,23,65,34}};
    int ave[10],sum[10];
    printf("No.     MA  EN  CN\n");
    for(i=0;i<10;i++)
    {
        for(j=0;j<4;j++)
            printf("%4d",s[i][j]);
        printf("\n");
    }
    for(i=0;i<10;i++)
    {
        for(j=1;j<4;j++)
            sum[i]=s[i][j]+sum[i];
    printf("%d\n",sum[i]);
    }

return 0;
}

发生了什么事?它背后的机制是什么?我该如何修复它?

2w2cym1i

2w2cym1i1#

sumave都是未初始化的数组。这意味着当你累加s[i]时,你的第一次加法是一个未初始化的值,它会调用未定义的行为。这里你只是得到一个随机但有效的值。
您需要确保在首次使用s[i][j]之前将其初始化为0:

int ave[10],sum[10] = {0}; // initialize the full sum array to 0

或:

for(i=0;i<10;i++)
{
    sum[i] = 0;      // ensure an initial value of 0
    for(j=1;j<4;j++)
        sum[i]=s[i][j]+sum[i];
    printf("%d\n",sum[i]);
}
9udxz4iz

9udxz4iz2#

最有可能的问题就在这句话里。

sum[i]=s[i][j]+sum[i];

“sum”整数数组在执行此语句之前尚未初始化,因此语句右侧的值“sum[i]”可能包含未定义的数据。请初始化sum数组,或者在出现其他类型的求值时修改语句。

相关问题