这个问题类似于"正确吗?“,但稍微深一些。
给予:
#include <stdint.h>int i;
int *ip1 = &i;
void *vp1 = ip1;
intptr_t x = (intptr_t)vp1;
void *vp2 = (void *)x;
int *ip2 = vp2;那么vp1 == vp2保证是真的(尽管它们可能不共享相同的二进制表示),但是ip1 == ip2保证是真吗?也就是说,在这种情况下,平等关系是可传递的吗?
发布于 2021-09-14 15:19:58
这种转换是可以保证的。
首先,从对象指针到void *和back的转换将在C标准的6.3.2.3p1节中描述。
指向
void的指针可以转换为指向任何对象类型的指针,也可以从指针转换到任何对象类型。指向任何对象类型的指针可以转换为指向void的指针,然后再转换回来;结果应该与原始指针相比较。
其次,在7.20.1.4p1节中描述了从void *到intptr_t和back的转换:
下面的类型指定有符号整数类型,该属性使指向
void的任何有效指针都可以转换为此类型,然后转换回指向void的指针,结果将与原始指针相比较: intptr_t 下面的类型指定一个无符号整数类型,该属性使指向void的任何有效指针都可以转换为此类型,然后转换回指向void的指针,结果将与原始指针相比较: uintptr_t 这些类型是可选的。
在这种情况下,int * (ip1)转换为void * (vp1),void *转换为intptr_t。
intptr_t被转换回void * (vp2)。到7.20.1.4p1,vp2必须与vp1相比较。
然后将vp2转换为int * (ip2)。由于vp2与vp1相同,将vp2转换为int *相当于将vp1转换为int *,因此将产生一个指针,该指针相当于6.3.2.3p1中的ip1。
https://stackoverflow.com/questions/69180325
复制相似问题