考虑以下代码片段:
class Address { int i ; char b; string c; public: void showMap ( void ) ; }; void Address :: showMap ( void ) { cout << "address of int :" << &i << endl ; cout << "address of char :" << &b << endl ; cout << "address of string :" << &c << endl ; }
预计输出应该显示int、char 和 string 成员变量的地址。然而,char 变量 b 的地址仍然为空。
出现这种奇怪的情况是因为 <<<运算符将 &b 解释为 C 样式字符串而不是地址。 Char 指针被 << 解释为空终止字符序列。
要解决此问题并显示 char 变量的地址,可以使用以下修改后的代码:
cout << "address of char :" << (void *) &b << endl;
这里,我们使用C 风格强制转换将 &b 显式转换为 void *。这指示 <<运算符将其视为地址而不是字符序列。更安全的替代方法是使用 static_cast:
cout << "address of char :" << static_cast<void *>(&b) << endl;
当 int、char 和 string 成员变量声明为 public 时,输出会略有变化:
... int : something ... char : ... string : something_2
这里,something_2 总是比 some 少 8。
出现这种差异是因为编译器会填充公共成员变量,以最佳方式对齐它们以进行内存访问。在这种情况下,char 变量可能被填充为 8 个字节,导致 int 和 string 变量之间的地址存在 8 字节的差异。
以上是为什么 `cout` 不能正确显示 `char` 成员变量的地址?的详细内容。更多信息请关注PHP中文网其他相关文章!