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

Run-Time Check Failure #2报错求助:C++数组栈损坏问题排查

解决Stack around variable 'Apr'被损坏的运行时错误

兄弟,你遇到的这个Run-Time Check Failure #2,根源是数组下标越界导致的栈内存损坏——这可是C++新手常踩的坑!咱们来一步步拆解问题:

问题出在哪?

看你readData函数里的循环逻辑:

  • 处理April温度时,你用了April[i],但April数组只有30个元素(有效下标范围是0~29),而此时i的取值是31~60,直接用i当下标会越界,往数组外面的栈内存写数据,这就把相邻变量的内存给覆盖了,触发了编译器的栈保护检查。
  • 同理,处理May的时候用May[i]也会越界:May数组下标是0~30,但此时i是61~91,远远超过了数组的有效范围。

另外你的循环条件写了i < 93,但你总共要读92个温度值,i从0到91就够了,多出来的i=92其实是多余的(不过这不是主要问题)。

修正后的代码

咱们可以把逻辑拆成三个独立循环,更清晰不易出错:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;

void readData(double March[], double April[], double May[]) {
    ifstream inputFile;
    inputFile.open("pgm6.txt");
    
    // 读取31个March的温度值
    for(int i = 0; i < 31; i++){
        inputFile >> March[i];
        cout << "March " << March[i] << endl;
    }
    // 读取30个April的温度值
    for(int i = 0; i < 30; i++){
        inputFile >> April[i];
        cout << "April " << April[i] << endl;
    }
    // 读取31个May的温度值
    for(int i = 0; i < 31; i++){
        inputFile >> May[i];
        cout << "May " << May[i] << endl;
    }
    
    inputFile.close(); // 别忘了关闭文件哦
}

int main() {
    double Mar[31], Apr[30], My[31];
    readData(Mar, Apr, My);
    return 0;
}

如果你想保留原来的单循环写法,只需要修正下标计算即可:

void readData(double March[], double April[], double May[]) {
    ifstream inputFile;
    inputFile.open("pgm6.txt");
    for(int i = 0; i < 92; i++){ // 92个元素,i从0到91刚好遍历完
        if (i < 31) {
            inputFile >> March[i];
            cout << "March " << March[i] << endl;
        }
        else if (i < 61) { // 31<=i<=60,对应April的0~29下标
            inputFile >> April[i - 31];
            cout << "April " << April[i - 31] << endl;
        }
        else { // 61<=i<=91,对应May的0~30下标
            inputFile >> May[i - 61];
            cout << "May " << May[i - 61] << endl;
        }
    }
    inputFile.close();
}

为什么注释掉第三个数组就没报错?

其实那只是“侥幸”——当你注释掉May数组后,越界的April写的内存可能刚好没覆盖到编译器栈保护的关键区域,或者栈布局变化让越界的影响没被检测到,但本质上代码还是有问题的,只是没触发错误而已。

内容的提问来源于stack exchange,提问作者UGP Studios

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:40:53