在for循环中c ++ char缓冲区的奇怪行为

时间:2015-12-18 13:11:24

标签: c++ loops char

#include <iostream>
using namespace std;
int main(){
    int n,i;
    cin>>n;
    cout<<n<<endl;
    for(i=0;i<n;i++){
        char x[3];
        cin>>x;
        cout<<x<<' '<<i<<endl;
    }
    return 0;
}

如果我输入

,请转到上述程序
2
X++
--X

输出结果为

2
X++ 0
--X 0
--X 1

我原以为

2
X++ 0
X-- 1

稍后我了解错误是什么,并将char x[3]替换为char x[4],因为字符串null已终止。但是为什么上面的程序以这种方式工作(我知道C不会因为溢出而抛出错误)。

1 个答案:

答案 0 :(得分:4)

您正试图将"X++"存储在char [3]中,这是不可能的,因为您需要为'\0'字符添加额外的单元格。

发生的事情是std::cin >>并不关心数组的大小,并且会从标准输入中写出尽可能多的字符(在第一个&#34;空格&#34;字符处停止)。

在这种情况下,std::cin >>将写入4个字符(X++\0),从而删除一个额外的内存字节&#34;结束&#34;变量x

可能,额外的内存字节包含循环变量i的值,因此您已经在循环中修改了i的值而不知道它。

您的代码不安全且有undefined behavior,在这种情况下使用std::string代替char []以避免此类行为:

std::string x ;
std::cin >> x ;

以下是一个关于你的记忆如何以及可能发生的事情的例子(这是示意图,不是真实的,只是为了解释):

一开始(i = 0x没有价值)。

|-----x-----|-------i-------|
| . | . | . | 0 | 0 | 0 | 0 |

在第一个循环结束时:

|-----x-----|-------i-------|
| X | + | + | 0 | 0 | 0 | 0 |

在第二个循环的开头(我假设为i的大端):

|-----x-----|-------i-------|
| X | + | + | 1 | 0 | 0 | 0 |

在第二个循环结束时:

|-----x-----|-------i-------|
| - | - | X | 0 | 0 | 0 | 0 |

您可以通过撰写x来查看,我已将i的值从1更改为0