C++多维数组求和存入新数组出现异常值问题求助
数组求和存储后输出异常问题
我尝试对一个二维数组中的每一行求和,并将结果存储到另一个数组中。代码如下:
#include <cstdlib> #include <iostream> using namespace std; int main() { int rev[2][12] = {{10,20,30,40,50,60,70,80,90,100,110,120}, {100,200,300,400,500,600,700,800,900,1000,1100,1200}}; int temp = 0; for (int j = 0; j<2;j++){ for(int i = 0; i<12; i++){ temp += rev[j][i]; } cout << "rev in year " << j+1 << ": " << temp << "\n"; temp = 0; } int revYear[2][1]; for (int j = 0; j<2;j++){ for(int i = 0; i<12; i++){ revYear[j][0] += rev[j][i]; } } cout << "rev in year 1: " << revYear[0][0] << "\n"; cout << "rev in year 2: " << revYear[1][0] << "\n"; return 0; }
第一段嵌套for循环能输出正确的求和结果,但第二段循环将结果存入revYear数组后,输出的却是:
rev in year 18363800 rev in year 278010
我在Mac的Xcode和Windows的VS上运行代码,均出现问题,只是输出值不同。注:第一段代码只是为了展示我能得到正确的求和结果。
问题原因与解决方法
原因分析
问题出在revYear数组的初始化上:
- 你声明的
int revYear[2][1];是局部数组,C++中局部变量(包括数组)如果没有显式初始化,其元素值是未定义的垃圾值(内存中残留的随机数据)。 - 第二段循环中执行
revYear[j][0] += rev[j][i];时,是在这个垃圾值的基础上累加求和,最终结果自然是错误的随机值。 - 不同编译器或环境下内存残留数据不同,所以输出的错误值也不一样,这不是编译器的问题,是代码逻辑的疏漏。
解决方法
只需要确保revYear的元素在累加前初始化为0,有两种常见方式:
方式1:声明数组时直接初始化
把数组声明改为:
int revYear[2][1] = {0}; // 用{0}初始化,所有元素都会被设为0
方式2:在循环前手动赋值0
在第二段循环开始前,先给每个元素清零:
int revYear[2][1]; for (int j = 0; j<2;j++){ revYear[j][0] = 0; // 先清零 for(int i = 0; i<12; i++){ revYear[j][0] += rev[j][i]; } }
修正后的完整代码
#include <cstdlib> #include <iostream> using namespace std; int main() { int rev[2][12] = {{10,20,30,40,50,60,70,80,90,100,110,120}, {100,200,300,400,500,600,700,800,900,1000,1100,1200}}; int temp = 0; for (int j = 0; j<2;j++){ for(int i = 0; i<12; i++){ temp += rev[j][i]; } cout << "rev in year " << j+1 << ": " << temp << "\n"; temp = 0; } int revYear[2][1] = {0}; // 显式初始化所有元素为0 for (int j = 0; j<2;j++){ for(int i = 0; i<12; i++){ revYear[j][0] += rev[j][i]; } } cout << "rev in year 1: " << revYear[0][0] << "\n"; cout << "rev in year 2: " << revYear[1][0] << "\n"; return 0; }
内容的提问来源于stack exchange,提问作者julian_rie
相关产品推荐
相关产品推荐

