【问题标题】:Printing a pointer with <iostream> [duplicate]使用 <iostream> 打印指针 [重复]
【发布时间】:2025-12-31 02:20:19
【问题描述】:

为什么

#include <iostream>
using namespace std;

int main() {
  cout << (char*)0x10 << endl; 
}

段错误,但是

#include <iostream>
using namespace std;

int main() {
  cout << (void*)0x10 << endl; 
}

似乎工作得很好?

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    因为

    cout::operator <<(void*) 
    

    打印一个内存地址,并且

    cout::operator <<(char*)
    

    打印一个以 null 结尾的字符数组,当您尝试从 0x10 读取 char 数组时遇到未定义的行为。

    【讨论】:

      【解决方案2】:

      ostream::operator&lt;&lt; 被重载,有一个version for char* 将给定指针解释为以空字符结尾的字符串。

      【讨论】:

        【解决方案3】:

        &lt;&lt;char* 有一个特殊的重载,因此可以轻松输出 C 风格的字符串。

        这样

        cout << (char*)0x10 << endl; 
        

        尝试打印出位于(char*)0x10 的字符串,这不是它应该查看的内存。

        【讨论】: