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

时间:2013-01-18 10:09:21

标签: c++ c visual-studio-2010

当我运行此代码时,我收到的错误是

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

int main()
{
    UINT8 temp[7];
    for (int i = 0; i <= 7; i++)
    {
        temp[i] = 0x01;
    }
    return 0;
}//The error falls here

请帮帮我。

7 个答案:

答案 0 :(得分:3)

您正在访问超出边界的数组

变化:

for (int i = 0; i <= 7; i++)

for (int i = 0; i < 7; i++)

或更多C ++方式:

std::fill_n(temp, 7, 0x01);  

答案 1 :(得分:2)

temp的大小为7,for循环达到8元素而不是7

变化

for (int i = 0; i <= 7; i++)

通过

for (int i = 0; i < 7; i++)

c中的数组索引从0开始。因此,如果从数组中的索引0转到索引7,这意味着您到达数组中的8th元素,但数组大小为7

答案 2 :(得分:2)

循环应该排除7 - 你的数组大小为7,所以没有索引为7的元素。

答案 3 :(得分:2)

声明UINT8 temp [7];创建一个包含7个变量的数组。从temp [0]开始到temp [6]

你的for循环会尝试访问未定义的temp [7]。 以下循环将起作用

for (int i = 0; i < 7; i++)
{
    temp[i] = 0x01;
}

答案 4 :(得分:1)

数组中有7个元素([0..6]),你的for循环尝试访问8个元素[0..7],因此你得到一个损坏的堆栈。

答案 5 :(得分:1)

for (int i = 0; i < 7; i++)
{
    temp[i] = 0x01;
}

这会对你有所帮助..你又回到了临时......这就是你得到的错误

答案 6 :(得分:0)

请注意,在C和C ++中,数组索引从0开始。因此,如果您有一个 N 项目数组,则有效索引值为0,1,2,...,( N -1)。

在您的情况下, N = 7,因此有效索引值为0,1,2,3,4,5,6。

因此,在for循环中用<=替换<

UINT8 temp[7];
for (int i = 0; i < 7; i++)  // Use <, not <=
 ....

此外,<stdlib.h>中的VS提供了方便的_countof() macro,这使您的代码更容易读取维护(而不是使用for循环中的“幻数”7:

for (int i = 0; i < _countof(temp); i++)

使用_countof(),如果更改数组的大小,循环代码仍然有效,而不会将7修改为新的数组大小。

另请注意,在C ++ 11中,可以使用基于范围的for循环(但它们在VC10 / Visual Studio 2010中不可用,您在此问题中用作标记)

请注意,如果要填充具有给定字节序列的缓冲区,可以使用memset(类似于C的方式):

memset(temp, 0x01, sizeof(temp));

或者,更一般地说(即使对于大于一个字节的元素),您可以使用来自std::fill的C ++ <algorithm>

fill(begin(temp), end(temp), 0x01);

使用像std::fill这样的显式算法可以使您的代码更具可读性,因为它提高了源代码的“语义级别”(您只需阅读“ fill ”而不是阅读“原始的“for循环,你必须解释的含义。”