运行时检查失败 #2 - 变量周围的堆栈'foo'已损坏
Run-Time Check Failure #2 - Stack around the variable 'foo' was corrupted
我正在为考试而学习,这是我的练习考试。问题是"以下代码片段会导致哪种类型的错误?
我很确定不会有错误,但我也无法让它在 VS13 中编译,我得到错误:
运行时检查失败 #2 - 变量"foo"周围的堆栈已损坏。
const int MAX = 500;
int main(void)
{
int foo[MAX];
for (int i = 0; i <= MAX; i++)
{
foo[i] = i * 2;
cout << foo[i] << endl;
}
cout << "Press any key to exit." << endl;
cin.ignore(2);
return 0;
}
foo
的有效索引为0
到MAX-1
(含(。 MAX
已经过了数组的末尾。
您的循环一直运行到并包括MAX
。这会写入数组末尾之外,从而损坏堆栈。
将数组大小增加到 MAX+1
,以便MAX
在范围内;或者将循环条件更改为 i < MAX
以在到达MAX
之前停止。
当您
尝试将太多数据写入特定内存地址时,会导致此问题。典型的原因是写入字符串缓冲区的内容超出了您的空间。
即
void myfun()
{
char mybuf[10];
strcpy(mybuf, "This is definitely more than 10 characters long, it will also cause a Run-Time Check");
}
造成这种情况的另一个原因是当您使用 memset/ZeroMemory 初始化大小错误的结构或数组时。
struct MyStruct
{
int var;
};
void myfun2()
{
MyStruct ms;
ZeroMemory(&ms, 20); //since MyStruct is only one variable in the struct this will cause problems
}
第三个可能的问题是,如果您不小心移动了指针。
void myfun3()
{
int a;
int*b = &a;
a++;
*a = 20;
}
当然,这些问题并不像上面那么容易发现,但我希望这会让你走上正确的轨道。但是这种情况会发生,并且会在堆栈返回时损坏的函数结束时中断。因此,最好的查看位置是 LoggerThread 变量所在的函数。
它通常分配一个超过最大值的数组成员。我做了一个小的密码破解程序,有一个大的源数组,没有概率。我发现由于循环条件错误,我正在调用超过最大数组大小的额外循环。
相关文章:
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- 数组变量周围的堆栈已损坏
- 运行时检查失败 - 变量周围的堆栈已损坏
- 调试:运行时检查失败 #2 - 变量"LoggerThread"周围的堆栈已损坏
- 运行时检查失败 #2 - 变量"数字选择"周围的堆栈已损坏
- 运行时间检查:变量周围的堆栈已损坏
- 变量"name"周围的堆栈已损坏C++
- MS 工作室 17 变量周围的堆栈已损坏
- 错误:运行时检查失败 #2 - 变量周围的堆栈已损坏
- C++指针:数组的堆栈已损坏
- 变量周围的堆栈已损坏
- C++ 变量周围的堆栈已损坏
- 运行时检查失败 #2 - 变量周围的堆栈---已损坏
- VS2010和OpenCV:变量周围的堆栈已损坏
- 指针函数参数已损坏,堆栈已损坏