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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:05:21