为什么以下代码块给出的输出为“ ZZZ(某些垃圾值)”而不是“ ZZ(某些垃圾值)”

时间:2019-10-28 16:14:51

标签: c++ c++11 pointers memory-address

在打印&a(cout<<&a)时,编译器给出输出'Z',但是当我们在打印字符地址之前打印字符时,编译器给出的输出(cout<<a<<" "<<&a)为'Z ZZ'。我知道cout对字符地址的处理方式有所不同,即在获得字符地址时,它不会打印该地址,而是会打印该地址处的内容。请帮我解决我在这里不见的概念。这是代码段:

#include <iostream>
using namespace std;
int main() {
    char a = 'Z';
    cout<<a<<&a;
    return 0;
}

2 个答案:

答案 0 :(得分:4)

char a = 'Z';
cout << &a;

这会将a的地址视为以空终止的字符串的地址,并打印该字符串。由于这不是指向以空终止的字符串的指针(而是指向单个char的指针),因此您的程序中存在未定义行为。

未定义行为表示该程序没有定义的行为,即它可以具有任何行为:它可以打印垃圾,可以打印其他垃圾,可以不打印任何东西,可以崩溃或几乎任何行为。< / p>

答案 1 :(得分:2)

如果要输出变量a的地址,请写

char a = 'Z';
cout << a << static_cast<void *>( &a );

否则,编译器将尝试输出由表达式&a指向的字符串,其类型为char *,直到遇到零终止字符为止。

因此输出

cout << &a;

具有未定义的行为。

如果要将变量a输出为具有字符串的数组,则必须声明一个数组而不是标量变量,并使用字符串文字而不是字符文字进行初始化。例如

char a[] = "Z";
cout << *a << &a;