【问题标题】:Run-Time Check Failure #2 - Stack around the variable 'foo' was corrupted运行时检查失败 #2 - 变量 'foo' 周围的堆栈已损坏
【发布时间】:2014-10-20 10:09:42
【问题描述】:

我正在准备考试,这是我的模拟考试。问题是“以下代码片段会导致哪种类型的错误?”

我很确定不会有错误,但我也无法让它在 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[500])。

标签: c++


【解决方案1】:

foo 的有效索引从 0MAX-1(含)。 MAX 超出了数组的末尾。

您的循环一直运行到MAX,包括MAX。这会超出数组的末尾写入,从而破坏堆栈。

要么将数组大小增加到MAX+1,以便MAX 在范围内;或将循环条件更改为i &lt; MAX 以在到达MAX 之前停止。

【讨论】:

    【解决方案2】:

    当您尝试将太多数据写入特定内存地址时会导致此问题。典型的原因是写入字符串缓冲区的内容超出了您的空间。

    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 变量所在的函数。

    【讨论】:

      【解决方案3】:

      它通常分配一个超过最大值的数组成员。我用一个大的源数组制作了一个小密码破解器,没有问题。我发现由于循环条件错误,我调用了一个超出最大数组大小的额外循环。

      【讨论】:

      • 这不会添加很多(如果有的话)信息。与其讨论堆栈损坏的可能原因,不如讨论相关代码出了什么问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2013-12-13
      • 2013-12-10
      • 2015-02-09
      • 2015-05-24
      • 2021-12-31
      • 2014-07-01
      相关资源
      最近更新 更多