为什么包含未使用的bool类型会影响char类型的引用?

Why does the inclusion of an unused bool affect the reference of a char?

本文关键字:类型 char 引用 影响 包含 bool 为什么 未使用      更新时间:2023-10-16

这段代码…

#include <iostream>
int main(int argc, char * argv[])
{
    char c = 'A';
    std::cout << &c;
    return 0;
}

…在Eclipse调试模式和命令行中都正确输出"A"。

然而,当我修改代码…

#include <iostream>
int main(int argc, char * argv[])
{
    char c = 'A';
    bool b = true;
    std::cout << &c;
    return 0;
}

…输出"A␁"(拉丁字母'A'后跟'start of header' ASCII控制字符)在Eclipse调试模式和Windows 7命令行上。顺便说一句,当使用bool b = false时,我没有得到␁性格。

我知道␀值为0,和␁有值1,但为什么cout << &c受bool的影响?有人能解释一下这是为什么吗?

编辑:忘记添加我的环境:Windows 7 64位,MinGW与g++ 4.5.2,在Eclipse Indigo

在第一个版本中你很幸运。

在第二个程序中,你很幸运(没有崩溃),但它打印了更多的垃圾。

当你使用&在char对象上,你得到一个char*。当你尝试流一个char*时,它的行为不同于所有其他指针(通常打印地址)。但是char*被假定为C-String。C-String是一个以空字符''结尾的字节序列;

实际发生的是,它从变量'c'开始打印每个内存位置(将其视为字符),并在内存中移动,直到找到字符''

例子1:

在你的情况下,你很幸运,恰好有一个空字符躺在内存变量'c'之后。

例子2:

在你的情况下,你很幸运,碰巧有一个空字符躺在内存变量'b'之后。但是变量'b'也被解释。

  • 当'b'的值为false时:转换为字符,这是''(同样的事情)。因此,只打印字母"A"。
  • 当'b'的值为true:转换为字符时,这是'1'。不是'',所以它被打印出来。你很幸运,下一个字节是'',打印停止。

你真正想做的是:

std::cout << c; // prints a character

或者您可以创建一个字符串:

char const* c = "A";  // Creates a null terminated C-String. Note the double quotes " "

或者获取地址

std::cout << static_cast<void*>(&c); // All other pointer types will print the address
                                     // Of the standard types only char* is treated 
                                     // differently with its own overload.

&c没有传递对c的引用,它传递的是c的地址。也就是说,您将char*传递给operator<<。该函数将从&c开始遍历内存,直到找到为止。

因为你没有一个以空结束的字符串,当函数走过c的内存末端时,你调用了未定义的行为。

你试过以下方法吗?

#include <iostream>
int main(int argc, char * argv[])
{
    char c = 'A';
    std::cout << c << std::endl; // no & needed.
    return 0;
}

假定char*指向一个C风格字符串(零终止),而不是单个字符。

如果你想显示地址(指针值),试试

cout << static_cast<void*>(&c);

简答:传递operator<<的是char的地址,并假定它是null终止字符串中第一个char的地址。它不是,除非偶然。代码中有UB