如何以整数存储内存地址?

时间:2012-11-05 15:32:27

标签: c++ 32bit-64bit void-pointers

这与找到的问题标题here完全相同 - 我还想将一个内存地址存储在一个变量中 - 或者更确切地说,一个void*存储在一个变量中。但是,我宁愿将其存储在int而不是string的某种形式中,因为我希望之后将其转换回指针。

这是因为它是一个类的成员,我想用boost serialize序列化,如果我确实使用void*,boost serialize可能会尝试存储指针指向的内容,在我的情况下,这不是很明智。

我需要32位和64位gcc和MSVC,所以基本上我想知道是否有一个内置的整数类型,它是同一平台上指针的大小。或者,我想我需要IFDEF我自己的类型?

3 个答案:

答案 0 :(得分:8)

intptr_tuintptr_t是整数类型,足以容纳void*。它们由<cstdint>中的C ++ 11和<stdint.h>

中的C99定义

如果uintptr_t不可用,您可以尝试使用相同标头中定义的uintmax_t<boost/cstdint.hpp>中的Boost。

答案 1 :(得分:6)

在C ++中将对象的地址转换为整数类型的一种方法(不使用C风格的转换)是使用reinterpret_cast。保证能够保存其他答案中提到的指针地址的整数类型是uintptr_t。

uintptr_t myint = reinterpret_cast<uintptr_t>(&myobject)

uintptr_t myint = reinterpret_cast<uintptr_t>(mypointer)

答案 2 :(得分:0)

您无法序列化指针。

只是因为当你绕过反序列化时,指针将无效。

使用类似JSON,XML,XDR等的选择。

序列化是为了让它变平。指针是一个分支。

BTW - 你忽略了这样一个事实:C ++假设在更安全的方面更好一点。