为了账号安全,请及时绑定邮箱和手机立即绑定

为什么将NULL发送到std :: cout输出后完全消失

为什么将NULL发送到std :: cout输出后完全消失

C++
HUWWW 2019-09-26 15:10:25
为什么将NULL发送到std :: cout输出后完全消失我花了好一会儿才弄清楚为什么某些cout输出似乎消失在以太币中了。罪魁祸首:std::cout<< "This line shows up just fine" << std::endl;const char* some_string = a_function_that_returns_null();if (some_string == 0)     std::cout<< "Let's check the value of some_string: " << some_string << std::endl;std::cout<< "This line and any cout output afterwards will not show up" << std::endl;上面代码段的输出将是:This line shows up just fineLet's check the value of some_string:因此,将NULL输入cout将会禁用以后的所有输出。为什么?以及如何解决?这并不是一直都发生的-具有相同代码的同事会获得所有预期的输出。而且,如果您想知道为什么我不能仅通过if语句阻止将NULL馈入cout:我正在大型代码库中工作,并且不知道在哪里发生这种情况!我所知道的是我从来没有出现过的cout陈述。更多信息:a_function_that_returns_null()实际上是getenv("HOST")。我通过在命令行上检查echo $HOSTHOST变量是否为空。如果我这样做export HOST=(bash风格),则输出全部存在。getenv在修改HOST变量之前,我不知道HOST变量最初包含什么,也不知道最初返回什么。我所知道的(some_string == 0)是真的。
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超12个赞

我相当确定这cout << (char*)NULL具有未定义的行为。恐怕“不要那样做”是我可以提供的最佳建议。


查看完整回答
反对 回复 2019-09-26
?
翻阅古今

TA贡献1780条经验 获得超5个赞

当您尝试输出时const char*,流将打印所有字节,直到到达为止'\0'。这导致未定义的行为。例如,您可以打印一些控制符号(即'\n''\r'等等),并得到不可预测的结果。

编辑:实际上,NULL指针的流式传输足以获取UB。由于有用的评论,我不会删除我的答案。


查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 807 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信