首先,这不是一个骗局:
将 int 转换为 void 指针并再次返回 int 是否安全? https://stackoverflow.com/questions/3568069/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。
EDIT
在 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...
不,这不能保证安全。
C99 标准有这样的说法(第 6.3.2.3 节):
整数可以转换为任何指针类型。除先前指定的情况外,
结果是实现定义的,可能未正确对齐,可能未指向
引用类型的实体,并且可能是陷阱表示。
任何指针类型都可以转换为整数类型。除先前指定的情况外,
结果是实现定义的。如果结果不能用整数类型表示,
该行为是未定义的。结果不必在任何整数的值范围内
类型。
我非常有信心 C99 之前的版本不会有任何不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)