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
相关产品推荐
相关产品推荐

