c89:将int转换为void*并返回

Rob*_*nes 8 c c89

首先,这不是一个骗局:

将int转换为void指针并再次返回int是否安全?

问题的不同之处在于:我只使用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
Run Code Online (Sandbox Code Playgroud)

我可能只是偷偷摸摸地装上类似的东西并期望它能起作用吗?似乎转换应该工作,因为所有intptr_t都是整数类型的typedef ...

Oli*_*rth 9

不,这不能保证是安全的.

C99标准就是这样说的(第6.3.2.3节):

整数可以转换为任何指针类型.除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示.

任何指针类型都可以转换为整数类型.除非先前指定,否则结果是实现定义的.如果结果无法以整数类型表示,则行为未定义.结果不必在任何整数类型的值范围内.

我非常有信心C99之前不会有任何不同.