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

2024-01-04

首先,这不是一个骗局:

将 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(使用前将#替换为@)

c89:将 int 转换为 void* 并返回 的相关文章

随机推荐