#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不会因为溢出而抛出错误)。
答案 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 = 0
,x
没有价值)。
|-----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
。