为何以下C++代码会陷入无限循环?
为什么这段C++代码会陷入无限循环?
问题代码
#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,按道理当index到5时应该退出循环,为什么会无限循环?
原因解释
这是数组越界访问引发的未定义行为,具体细节如下:
BufferSize为5,意味着BufArr是包含5个int元素的数组,合法索引范围是0~4。- 循环条件
index<=BufferSize会让index=5时仍执行循环体,此时BufArr[5]属于越界访问——C++不会对数组越界做运行时检查。 - 看
Buffer类的内存布局:BufArr是第一个成员,紧随其后的就是index变量。在绝大多数编译器的实现中,这两个变量是连续存储的。所以BufArr[5]对应的内存地址,恰好就是index变量的地址。 - 执行
BufArr[5]=0时,实际上是把index的值改成了0。下一次循环判断时,index又回到0,循环便从头开始,陷入无限重复。
简言之:越界写入数组的"第6个元素",意外覆盖了循环变量index,将其重置为0,导致循环永远无法终止。
内容的提问来源于stack exchange,提问作者Alok Ranjan Srivastava
相关产品推荐
相关产品推荐

