【问题标题】:cout input stream with and without (void*)cout 输入流带和不带 (void*)
【发布时间】:2012-05-02 16:00:52
【问题描述】:

我有一个输入流 IPCimstream,它使用 dataBuf() 函数返回指向其流的字符缓冲区的指针。

说我有
IPCimstream ims;

和印刷有什么区别
1.

cout << ims.dataBuf() << endl;   


2.

cout << (void*)ims.dataBuf() << endl;

如果可能,请举例说明。假设 ims.dataBuf() 具有“Hello world\n”等或其他您认为可以很好地解释差异的示例。抱歉,我是输入流的新手,如果有的话,我想不出更多有趣的例子。

另外,如果 IPCimstream 是字符流与二进制流,会有什么区别。谢谢。

【问题讨论】:

    标签: c++ input stream void cout


    【解决方案1】:

    嗯,不同之处在于cout::operator&lt;&lt;char* 重载将指针视为以零结尾的C 字符串(嗯,C 字符串 无论如何都只是字符指针),所以它输出字符串本身。如果你的缓冲区不是以零结尾的字符串,那么cout 的猜测是错误的,所以它会输出一些随机垃圾直到第一个\0

    同一运算符的void*版本不知道指针背后的对象是什么,所以它所能做的只是输出指针值。

    你看,这种行为IPCimstream类相关,这正是cout的工作方式。 (查看http://ideone.com/1ErtV 的示例)。

    编辑:
    如果dataBuf 包含"Hello world\n",则char* 版本会将指针解释为以零结尾的字符串。所以它会输出字符“Hello world”,输出换行符,然后是内存中在\n之后的所有字符,直到下一个\0。如果内存中没有这样的字符,程序可能会崩溃。 (对于语言纯粹主义者:你会得到未定义的行为。)

    void* 版本不知道如何处理指针指向的值——所以它自己输出指针值(即地址)。

    编辑 2:
    字符流和二进制流的区别可能只在于它们持有的数据。在任何情况下,如果dataBuf() 返回一个char*cout 将输出在缓冲区中找到的所有字符(可能超出它)直到第一个\0(或者如果\0 在开始),并且通过强制转换,您将只获得缓冲区的地址输出为字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      相关资源
      最近更新 更多