在 C++ 中将对象的地址转换为 char* 或 char 数组

Converting a Object's address into a char* or char array in C++

我正在创建一个模拟移动网络,使用命名管道在进程之间传输信息。我想创建一个框架 class 来保存我需要的数据并将该框架的地址传递到管道中。为了挽救我的生命,我唯一想不出的是如何将我的帧地址转换为字符指针,以便将其传递给 write() 函数。这是我目前的概要:

NFrame *frame = new NFrame;
// set frame information
char *f_address = (char*)(frame);

std::cout << f_address << std::cout;

每当我调用 cout 来验证地址时,我得到的都是不可读的字符。我搞砸了 reinterpret_cast,我 运行 遇到了同样的情况。

我错过了什么,或者我做对了吗?

地址中会有很多不可打印的字符。您可能想要的是将地址转换为原始字节,然后将其转换为十六进制字符串。

你可能想要的是serialization. It is often preferable (for ease of debugging) to serialize in some textual format like JSON. You could use libraries like JsonCPP for that. See also s11n,它是一个二进制序列化框架(但我推荐JSON)。

您通常不应写入某些复杂 C++ 对象的原始内存字节,因为它们包含大多数其他程序和进程无法读取的数据(例如,指向您进程的内部指针;在另一个进程中 运行即使是同一个程序,也很可能因为ASLR).

而不同

(如果您确定它们被同一个进程读取,您可能会写入原始内存字节;但即使这样对于 C++ 程序也可能是错误的)

如果(例如出于调试目的)您只想显示某个堆分配对象的 地址,您可以将其转换为 (void*),例如:

std::cout << "frame@" << (void*)frame << std::endl;

但是这样的地址(通常是六进制的)可读性不是很好,当然也不会告诉你 frame.

的内部状态。

您可以定义(通过 overloading the output << operator)您自己的输出 << 运算符,例如

std::ostream& operator <<(std::ostream&, const NFrame&);

然后编码 std::cout << (*frame) << std::endl

当然,您可以将std::cout替换为std::ofstream to output into some file, or some instance of std::ostringstream的某个实例以输出为字符串。

那是因为 cout 'thinks' 您正在向它传递一个显示为 char *.

的字符串

试试这个:

std::cout << reinterpret_cast<void*>(f_address) << std::endl;