首先,这不是一个骗局:
问题的不同之处在于:我只使用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 ...
不,这不能保证是安全的.
C99标准就是这样说的(第6.3.2.3节):
整数可以转换为任何指针类型.除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示.
任何指针类型都可以转换为整数类型.除非先前指定,否则结果是实现定义的.如果结果无法以整数类型表示,则行为未定义.结果不必在任何整数类型的值范围内.
我非常有信心C99之前不会有任何不同.
| 归档时间: |
|
| 查看次数: |
3083 次 |
| 最近记录: |