堆栈周围的变量损坏。为啥会这样? [关闭]

Posted

技术标签:

【中文标题】堆栈周围的变量损坏。为啥会这样? [关闭]【英文标题】:Stack around variable corrupted. Why does this happen? [closed]堆栈周围的变量损坏。为什么会这样? [关闭] 【发布时间】:2011-12-10 15:08:53 【问题描述】:

我将BufferOut 定义为一个 16 元素数组。

但我在调试时遇到此消息。

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

HIDBufferOutchar 数组的 16 个元素

 HIDBufferOut BufferOut; // first element is the report ID 
    BufferOut[0] = 0; 
    BufferOut[1] = 211; 
    BufferOut[16] = 44; 
    BufferOut[4] = 4;

    .
    .
    .
    .
    etc

【问题讨论】:

错误信息足够描述性。如果你想不通,那么我们也不能不看源代码。 HIDBufferOut BufferOut; // first element is the report ID BufferOut[0] = 0; BufferOut[1] = Marker(); BufferOut[16] = (int) 44; BufferOut[4] = typ; 因为您要在数组中插入第 17 个元素 BufferOut 是一个16 元素的数组是什么? Marker() 实际上做了什么?什么是典型?您需要发布导致问题的代码的最小示例,并对变量是什么进行某种解释。 @user1091216 我看到你已经“更新”了你的代码。但是,我仍然看不到数组。你的 16 个元素的数组在哪里?我看到一个名为 BufferOut 的 HIDBufferOut ..... 【参考方案1】:

如果 BufferOut 是 16 个元素的缓冲区,则有效索引为 0、...、15。这意味着:

BufferOut[16] = (int) 44;

写入超出数组范围,导致内存损坏。

【讨论】:

我尝试用 17 个元素定义它,但问题还是一样 您在哪里创建阵列?我在上面的代码中没有看到它。 @user1091216:如果是这样,那么您仍然没有提供足够的信息。【参考方案2】:

这通常发生在您在无法触及的位置写入导致缓冲区溢出和堆栈损坏时,从这段代码中可以清楚地看出: BufferOut[16] = (int) 44; //你在第 17 个位置写的越界

【讨论】:

将数组大小更改为 17 个元素,如果它仍然存在,请进行清理,而不是从头开始重新构建项目有时会有所帮助。【参考方案3】:

希望对你有帮助

http://developer.qt.nokia.com/forums/viewthread/7454

http://www.cplusplus.com/forum/beginner/37292/

【讨论】:

您可能想阅读 this relevant Meta thread 以了解仅链接的答案。

以上是关于堆栈周围的变量损坏。为啥会这样? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c++ 运行时检查失败 #2 - 变量“ToSend22”周围的堆栈已损坏

如何修复“调试错误!,变量'x'周围的堆栈已损坏”?

变量“Yarray”周围的堆栈已损坏

数组变量周围的堆栈损坏

变量周围的堆栈已损坏(将 long long 转换为字节数组)

VS2010 和 OpenCV:变量周围的堆栈已损坏