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

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

本文关键字:char 数组 转换 地址 C++ 对象      更新时间:2023-10-16

我正在创建一个模拟的移动网络,使用命名管道在进程之间进行信息传输。我的想法是创建一个框架类来保存所需的数据,并将该框架的地址传递到管道中。唯一的事情我不能弄清楚,以挽救我的生命是如何将我的帧的地址转换成一个字符指针,以便将其传递到write()函数。这是我到目前为止的大纲:

NFrame *frame = new NFrame;
// set frame information
char *f_address = (char*)(frame);
std::cout << f_address << std::cout;

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

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

您可能需要的是序列化。通常(为了便于调试)以JSON之类的文本格式进行序列化更为可取。你可以使用JsonCPP这样的库。另请参阅s11n,它是一个二进制序列化框架(但我推荐JSON)。

你通常不应该写一些复杂的c++对象的原始内存字节,因为它们包含的数据对大多数其他程序和进程来说是不可读的(例如,指向你的进程的内部指针;在另一个运行相同程序的进程中,它们很可能因为ASLR而不同。

(你可以写原始内存字节,如果你确定它们被相同的进程读取;但这对于c++程序来说可能是错误的)

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

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

但是这样的地址(通常是十六进制)不是很好读,当然也不能告诉你的frame的内部状态。

您可以定义(通过重载输出<<操作符)您自己的输出<<操作符,如

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

then code std::cout << (*frame) << std::endl

当然,您可以将std::cout替换为std::ofstream的某个实例以输出到某个文件中,或者替换为std::ostringstream的某个实例以输出到一个字符串中。

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

这是因为cout '认为'您正在传递给它一个字符串,该字符串呈现为char *

试试这个:

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