2017-01-15 87 views
3

打印一个指向一个int后,我打印指向一个字符:C++:用cout和指针无法解释的行为为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 << "&i: " << &i << endl;,并再次运行该程序,我得到以下原因不明的输出:

&q: q���� 

有谁知道为什么会发生这种情况?

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

注意:我不期待从cout得到q的地址。我期待得到由& q指向的C字符串。我错误的是,如果预先包含行cout << "&i: " << &i << endl;,输出如何打印'q'。但是,如果我将该行注释掉,则输出中会有垃圾数据。为什么在包含行cout << "&i: " << &i << endl;时我的输出中没有垃圾数据?

+1

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

回答

2

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

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

+0

那么为什么我在事先包含“cout <<”&i:“<<&i << endl;'这一行时不会获得额外的输出? –

+0

因为'&i'是一个整数指针 - 并且以不同的方式对待 –

+1

@Daniel值得注意的是,打印非NUL终止的'c_str'是**未定义的行为**。你的情况发生了什么。这就是为什么'cout'序列在你的编译器中也有所作用的原因。它可能会或可能不会在我的编译器中产生这样的差异。 – iammilind