【问题标题】:Does "cout<<(char*)NULL" doing "close(1)" here? [duplicate]“cout<<(char*)NULL” 在这里做“close(1)”吗? [复制]
【发布时间】:2014-06-10 13:57:47
【问题描述】:

在下面的代码中,我在这一行之后使用了cout&lt;&lt;(char*)NULL;,我的程序在输出屏幕上没有打印任何内容。这是否意味着我在这里完成了close(1)cout?这里实际发生了什么?这是一个错误吗?请分享您的想法。

#include<iostream>
using namespace std;

void f(){
    cout<<"\nfun\n";
}

main(){
cout<<(char*)NULL;
f(); //not getting printed !
cout<<"\nhello\n";  //not getting printed !
cout<<"hii how are you?"; //not getting printed, why??
}

我在 gcc 和 DevCpp 编译器上都试过了,观察到的行为相同。

【问题讨论】:

    标签: c++ unix


    【解决方案1】:

    cout &lt;&lt; (char *)NULL 导致未定义的行为。什么事情都可能发生。 (编译器在生成汇编代码时假定您不这样做)。

    此处使用的char * 参数必须指向以空字符结尾的字符串中的字符。

    【讨论】:

      【解决方案2】:

      在这里,您在流上设置 badbit,这会导致在 cout&lt;&lt;(char*)NULL; 之后不打印任何内容

      if (!__s)
       __out.setstate(ios_base::badbit);
      

      标准说:requires: shall not be a null pointer。所以你的程序肯定有未定义的行为,它应该被修复。您可以使用cout.clear() 清除坏位。

      在您的情况下,cout&lt;&lt;(char*)NULL; 会导致未定义的行为。但是 GCC 可以安全地使用它。

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        (char*)NULL 不会将NULL 变成像"NULL" 这样的字符串,如果您是这样想的话。 NULL 实际上是一个扩展为0 的宏。将其转换为 char* 会将其转换为指向零的指针(空指针)。唯一的问题是打印出来。尝试打印空指针是Undefined Behavior。到目前为止,您无法理解程序表现出的任何行为。您的程序没有崩溃这一事实让我感到惊讶。

        【讨论】:

        • 是的,令人惊讶的是,我在我的 Linux 上运行了这个示例程序(同时使用编译器 gcc 和 clang),它没有崩溃。
        猜你喜欢
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 1970-01-01
        相关资源
        最近更新 更多