这段C代码运行结果每次不同且不正确,求原因分析及修复方案
C代码输出异常的原因分析与修复
问题原因
核心问题是**sum数组未进行初始化**。这段代码里的sum是局部数组,在C语言中,局部变量如果没有显式初始化,其值是栈内存中遗留的随机垃圾数据,每次程序运行时栈上的残留内容都不一样,所以累加计算出来的结果每次都不同,而且完全不正确。
背后的运行机制
C语言中,函数内的局部变量(包括数组)是分配在栈内存中的。栈内存会反复被不同的函数调用、变量创建销毁复用,当你声明一个局部变量却不初始化时,它会直接使用栈上当前位置的原有数据——这些数据可能是之前程序运行留下的垃圾值,没有任何确定意义。
在代码的累加循环里,sum[i] = s[i][j] + sum[i]第一次执行时,sum[i]就是这个随机垃圾值,后续的累加都是基于这个错误的初始值计算,最终结果自然错误且不可预测。
修复方案
有两种简单的修复方式:
方式一:声明时初始化sum数组
直接在声明sum时将所有元素初始化为0,C语言中如果初始化列表只写{0},会自动把数组所有元素设为0:
int ave[10], sum[10] = {0};
方式二:每次循环前初始化sum[i]
在计算每个学生的总分前,先把sum[i]置为0,再开始累加:
for(i=0;i<10;i++) { sum[i] = 0; // 先初始化当前sum[i]为0 for(j=1;j<4;j++) sum[i]=s[i][j]+sum[i]; printf("%d\n",sum[i]); }
修复后的代码运行时,sum的初始值都是0,累加出来的总分就是正确的科目分数之和了。
内容的提问来源于stack exchange,提问作者JinanSpring
相关产品推荐
相关产品推荐

