假设你从一个void指针,一个char指针,一个int指针,或者你想要命名的任何东西开始。
void *p = // initialized to something here
我们进行转换,如
*((int *)((char *)p + 6)) = 5;
这是否意味着我们基本上将一个void指针转换为char指针,进行一些算术运算,将其转换为int指针,然后将其取消引用以存储5?
或者我们是否需要将char指针强制转换回void指针,然后才能将其强制转换为int指针?
* 此外,在从char *转换为int *之前,是否需要在转换之前的某处取消引用?
答案 0 :(得分:7)
您展示的转化在语法上是有效的C.在void *
的路上通过int *
类型投射没有任何区别。
它是否在语义上正确取决于(char *)p + 6
指向的内存是否正确调整大小并对齐以便以int
进行访问。
答案 1 :(得分:1)
将一个char指针转换回一个void指针,然后再将它转换为一个int指针,这不会比只是将一个char指针转换为一个int指针更好。你必须真正知道你在做什么才能使它工作,因为你必须处理对齐问题。
答案 2 :(得分:1)
static_cast
,dynamic_cast
和reinterpret_cast
。
推荐阅读:
答案 3 :(得分:0)
从指向一个整数类型的指针转换到指向另一个整数类型的另一个指针是未定义的行为,如果它导致对齐问题(C99 6.3.2.3)。如果没有,您可以安全地在它们之间施放。 char
是整数类型。
(C标准在这里有点奇怪,声明这是UB。这应该是实现定义的行为,因为它取决于特定的CPU架构并且在许多情况下是安全的。)
就你的具体例子而言,它确实意味着你描述的内容。其背后的原因很可能是: