当我运行此代码时,我收到的错误是
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
请帮帮我。
答案 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
循环,你必须解释的含义。”