【问题标题】:Strange behaviour of c++ char buffers in a for loopfor循环中c ++ char缓冲区的奇怪行为
【发布时间】:2016-03-25 05:09:38
【问题描述】:
#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 不会因为溢出而抛出错误)。

【问题讨论】:

  • 您不能将"X++" 存储在char [3] 中,您需要一个额外的单元格用于nul 字符。
  • 未定义的行为。
  • “我知道 C 不会因溢出而引发错误” 这不是真的。 C 没有定义然后要做什么,但是编译器/运行时可以选择来抛出错误。此外,C 不是 C++,您使用的是 C++。

标签: c++ loops char


【解决方案1】:

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

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

在这种情况下,std::cin &gt;&gt; 将写入 4 个字符(X++\0),从而在变量 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

【讨论】:

  • 很好地使用了 ASCII 艺术,+1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多