考虑下面的代码:
#include <iostream>
using namespace std;
class Buffer {
public:
static const int BufferSize=5;
Buffer() {
for(this->index=0;this->index<=BufferSize;this->index+=1) {
BufArr[this->index]=0;
cout<<"index: "<<index<<"\n";
}
}
int BufArr[BufferSize];
int index;
};
int main() {
Buffer b;
return 0;
}
如果我们运行这段代码,它会打印:
0
1
2
3
4
0
1
2
3
4
...
并继续打印,为什么?它应该停止(因为我们有
index<=BufferSize
条件)。
请帮助我理解这一点。
你的循环条件是:
this->index<=BufferSize
这意味着在最后一次迭代中
index
将是 5
。BufArr[this->index]
访问数组越界,导致 UB(未定义行为)。这意味着该标准不保证程序的行为。
您需要使用
<
而不是 <=
:
this->index<BufferSize
旁注:
请参阅:“使用命名空间 std;”有什么问题?
数组的索引为 0。这意味着当您计算 5 个值 (1,2,3,4,5) 时,数组计数为:0,1,2,3,4,您的 for 循环要求小于等于缓冲区大小 (
<=
),而它应该是<
。您的数组在当前状态下运行超出范围,这会导致溢出,从而再次导致未定义的行为