将void *分配给UINT或unsigned int

时间:2014-07-02 13:40:13

标签: c++ visual-c++ gcc visual-c++-2010 visual-c++-2012

我今天在工作场所学到了这一点。在发布问题之前,我先阅读thisthisthis

这是我的高级同事告诉我的事情:

  

您不能将void *分配给UINT或unsigned int。它不适用于64位。

但为什么呢?是因为void*unsigned int在不同的架构上有不同的大小(如其他问题中所述),还是其他什么?

4 个答案:

答案 0 :(得分:1)

您基本上是正确的:无法保证unsigned int具有与void* 相同的机器字长,因此您无法保证在他们之间施展而不丢失信息。 Here是一个很好的常见问题解答。

要记住的主要事情是void*是一个任意的数据指针,而不是真正的任意指针。实际上,没有真正通用的指针:例如,某些机器可能具有不同的程序和数据地址空间,因此每个指针的大小可能不同。有关详细信息,请参阅this SO answer

答案 1 :(得分:1)

是的,就是这种情况。

您的实现可能会提供可选类型uintptr_t,但定义如下:

  

以下类型指定无符号整数类型,其属性为any   指向void的指针可以转换为这种类型,然后转换回指向void的指针,   并且结果将与原始指针进行比较:

     

uintptr_t

签名对手intptr_t也可能有空。 <cstdint>标题中提供了这些类型。

通过选择使用这些类型,您承认您的代码将仅使用在目标计算机上提供此类型的实现的子集进行编译。

答案 2 :(得分:1)

如果void*身体适合unisigned int游戏结束,那么大小显然是一个显示阻止。但是,即使sizeof(void*) == sizeof(unsigned int)存在类型兼容性问题:一个包含数据指针,另一个包含数据。你必须reinterpret_cast<>()一个到另一个,并且所有的赌注都是关于这将如何运作。

答案 3 :(得分:1)

取决于您的申请目标。您标记为VC++并提及类型UINT - 因此您似乎正在为Windows构建。在32位Windows中,指针大小为32位,而在64位Windows中则为64位。但是,对于两种Windows风格,类型UINT的大小与32位类似。您可以使用__uint64UINT64 MS特定类型而不是UINT来确保它对指针来说足够大。您还可以使用专门设计用于匹配指针大小的INT_PTR / UINT_PTR类型(从而使其对32/64位风格透明)。

有关各种数据类型的参考,请参阅http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx

当然,所有这些都将使您的程序本身不能移植到其他架构/操作系统。