在 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;
我正在创建一个模拟移动网络,使用命名管道在进程之间传输信息。我想创建一个框架 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;