为什么下面的代码会进入无限循环

问题描述 投票:0回答:2

考虑下面的代码:

#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
条件)。

请帮助我理解这一点。

c++
2个回答
2
投票

你的循环条件是:

this->index<=BufferSize

这意味着在最后一次迭代中

index
将是
5

然后
BufArr[this->index]
访问数组越界,导致 UB(未定义行为)。这意味着该标准不保证程序的行为。

您需要使用

<
而不是
<=
:

this->index<BufferSize

现场演示

旁注:
请参阅:“使用命名空间 std;”有什么问题?


0
投票

数组的索引为 0。这意味着当您计算 5 个值 (1,2,3,4,5) 时,数组计数为:0,1,2,3,4,您的 for 循环要求小于等于缓冲区大小 (

<=
),而它应该是
<
。您的数组在当前状态下运行超出范围,这会导致溢出,从而再次导致未定义的行为

© www.soinside.com 2019 - 2024. All rights reserved.