【发布时间】:2011-10-25 22:08:05
【问题描述】:
首先,这不是欺骗:
Is it safe to cast an int to void pointer and back to int again?
问题的不同之处在于:我只使用 void* 来存储 int,但我从未真正将它用作 void*。
所以问题真的归结为:
是否保证 void * 至少与 int 一样宽
我无法使用 intptr_t,因为我使用的是 c89 / ANSI C。
编辑
在 C99(gcc 版本)的 stdint.h 中,我看到以下内容:
/* Types for `void *' pointers. */
#if __WORDSIZE == 64
# ifndef __intptr_t_defined
typedef long int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned long int uintptr_t;
#else
# ifndef __intptr_t_defined
typedef int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned int uintptr_t;
#endif
我是否可以直接安装类似的东西并期望它能够工作?看起来强制转换应该起作用,因为所有 intptr_t 都是整数类型的 typedef...
【问题讨论】:
-
为什么需要将
int存储在void *中? -
@Oli Charlesworth:我想构建一个灵活的数组“类”,它可以处理指向对象的指针和原始内部类型(如 int)。我曾想过尝试使用联合来强制提供足够的存储空间,但问题是铸造可能会以意想不到的方式搞砸。我知道我可以在现代 x86 上摆脱它,但我希望它是可移植的。
-
什么选角?你在说
union { int i; void *p; }吗? -
@Oli Charlesworth:在内部我可能有一个联合,但接口类似于 int appendData( void * data );
-
为什么不存储您的数据并使用
void*指向它?在void*内部存储一些东西几乎没有意义。