在c++中,char定义的变量取地址时,为什么会输出 “烫烫烫...“?

在 C++ 中,当你直接输出 char* 指针(比如 &b)时,std::cout 会将其视为 C 风格字符串(即以 '\0' 结尾的字符数组),而不是内存地址。因此,它会尝试从 b 的地址开始读取内存,直到遇到 '\0' 为止,但由于 b 只是一个单独的 char,后面的内存内容是未初始化的(可能是垃圾值),所以会输出乱码(如 “烫烫烫…”)。


为什么会输出 “烫烫烫…”?

  1. &b 被当作字符串处理
    std::coutchar* 有特殊处理,会把它当作字符串的起始地址,并尝试打印直到 '\0' 结束。但由于 b 只是一个字节,后面的内存可能是随机数据,导致乱码。

  2. “烫烫烫…” 的由来

    • 在 Windows 的 Debug 模式下,未初始化的栈内存通常会被填充为 0xCC(MSVC 编译器的调试模式行为)。
    • 0xCC 在 GBK 编码下对应汉字 “烫”,所以连续输出多个 0xCC 就会显示为 “烫烫烫…”。

如何正确输出 char 变量的地址?

如果你想输出 char 变量的 内存地址,而不是把它当作字符串,你需要将 &b 强制转换为 void*

char b;
std::cout << "变量 b 的地址:" << static_cast<void*>(&b) << std::endl;

或者:

std::cout << "变量 b 的地址:" << (void*)&b << std::endl;

这样 std::cout 就不会把它当作字符串,而是直接输出指针的地址值。


示例代码

#include <iostream>

int main() {
    char b;
    std::cout << "错误的输出方式(当作字符串处理): " << &b << std::endl;  // 可能输出乱码
    std::cout << "正确的输出方式(强制转为 void*): " << static_cast<void*>(&b) << std::endl;  // 输出真实地址
    return 0;
}

总结

  • std::coutchar* 特殊处理,会尝试打印字符串,而不是地址。
  • 未初始化的内存可能包含垃圾值,导致输出乱码(如 “烫烫烫…”)。
  • 正确做法是强制转换为 void*,这样 std::cout 会直接输出地址值。

这样可以避免乱码,正确显示变量的内存地址。

    int a;
    char b;
    bool c;
    string d;
    std::cout<<"变量a的地址:"<<&a<<std::endl;
    std::cout<<"变量b的地址:"<<&b<<std::endl;
    std::cout<<"变量c的地址:"<<&c<<std::endl;
    std::cout<<"变量d的地址:"<<&d<<std::endl;
    std::cout<<"改成================="<<std::endl;
    std::cout<<"变量a的地址:"<<(void*)&a<<std::endl;
    std::cout<<"变量b的地址:"<<(void*)&b<<std::endl;
    std::cout<<"变量c的地址:"<<(void*)&c<<std::endl;
    std::cout<<"变量d的地址:"<<(void*)&d<<std::endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值