【问题标题】:C++: Unexplainable behavior with cout and pointer to char [duplicate]C ++:cout和指向char的指针的无法解释的行为[重复]
【发布时间】:2017-01-15 05:58:00
【问题描述】:

打印一个指向 int 的指针后,我打印一个指向 char 的指针:

#include <iostream>

using namespace std;

int main() {

    int i;
    cout << "&i: " << &i << endl;

    char q = 'q';
    cout << "&q: " << &q << endl;

    return 0;

}

我按预期得到以下输出:

&i: 0xffffcc0c
&q: q

但是,如果我注释掉 cout &lt;&lt; "&amp;i: " &lt;&lt; &amp;i &lt;&lt; endl;,然后再次运行程序,我会得到以下无法解释的输出:

&q: q����

有人知道为什么会这样吗?

如果它与将operator&lt;&lt; 插入到流中直到找到空字符有关,那么当我包含cout &lt;&lt; "&amp;i: " &lt;&lt; &amp;i &lt;&lt; endl; 时为什么会得到预期的输出?

注意:我不希望从 cout 中获取 q 的地址。我期望得到 &q 指向的 C 字符串。令我烦恼的是,如果我事先包含cout &lt;&lt; "&amp;i: " &lt;&lt; &amp;i &lt;&lt; endl; 行,那么输出将如何打印“q”。但是,如果我将该行注释掉,则输出中有垃圾数据。为什么当我包含 cout &lt;&lt; "&amp;i: " &lt;&lt; &amp;i &lt;&lt; endl; 行时,我的输出中没有垃圾数据?

【问题讨论】:

  • @iammilind 不是重复的。我不期待一个地址,而是一个 C 字符串。但是,我认为您回答了我的问题:“值得注意的是,打印非 NUL 终止的 c_str 是一种未定义的行为。在您的情况下会发生这种情况。这就是为什么 cout 序列也会对您的编译器产生影响。它可能会或可能不会在我的编译器中产生这样的差异。”谢谢!

标签: c++ output cout c-strings char-pointer


【解决方案1】:

&amp;q 认为它是一个字符串。

因此将打印到空字符。因此额外的输出

【讨论】:

  • 那为什么我事先包含cout &lt;&lt; "&amp;i: " &lt;&lt; &amp;i &lt;&lt; endl;这一行没有得到额外的输出呢?
  • 因为&amp;i 是一个整数指针 - 并且被区别对待
  • @Daniel 值得注意的是,打印一个非 NUL 终止的c_str 是一种未定义的行为。在您的情况下会发生这种情况。这就是为什么cout 序列也会对您的编译器产生影响。它在我的编译器中可能会或可能不会产生这样的差异。
  • @DanielGilbert,如果您的意思是 &amp;q 输出会根据存在的另一行而变化,那是因为打印从 &amp;q 开始的字符串超出了您拥有的内存的单个字符,即是未定义的行为。你不能安全地依赖任何特定的行为。
  • @iammilind - std::string 不涉及 - C 字符串(或缺少)是
猜你喜欢
  • 2021-07-28
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2012-09-21
  • 2023-03-08
相关资源
最近更新 更多