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

时间:2015-09-05 19:47:08

标签: c++ pointers casting char memory-address

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

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

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

每当我打电话给cout来验证我得到的地址都是不可读的字符。我和reinterpret_cast搞混了,我遇到了同样的情况。

我错过了什么,或者我是否正确行事。

3 个答案:

答案 0 :(得分:1)

你可能想要的是serialization。通常优选(为了便于调试)以某种文本格式(如JSON)进行序列化。您可以使用JsonCPP之类的库。另请参阅s11n这是一个二进制序列化框架(但我推荐使用JSON)。

你通常不应该写一些复杂的C ++对象的原始内存字节,因为它们包含大多数其他程序和进程无法读取的数据(例如,指向你的进程的内部指针;在另一个运行甚至相同程序的进程中,它们由于ASLR),可能会有所不同。

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

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

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

但是这样的地址(通常是hexa)不是很易读,当然也不会告诉你frame的内部状态。

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

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

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

当然,你可以用std::ofstream的某个实例替换std::cout以输出到某个文件,或输出到字符串的某个std :: ostringstream实例。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

那是因为cout'认为'你传递的字符串是char *

试试这个:

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