运行时检查失败 #2 - 变量周围的堆栈'foo'已损坏

Run-Time Check Failure #2 - Stack around the variable 'foo' was corrupted

本文关键字:堆栈 已损坏 foo 周围 失败 检查 变量 运行时      更新时间:2023-10-16

我正在为考试而学习,这是我的练习考试。问题是"以下代码片段会导致哪种类型的错误?

我很确定不会有错误,但我也无法让它在 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的有效索引为0MAX-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 变量所在的函数。

它通常分配一个超过最大值的数组成员。我做了一个小的密码破解程序,有一个大的源数组,没有概率。我发现由于循环条件错误,我正在调用超过最大数组大小的额外循环。