我在C中有一个方法,它需要一个双指针作为参数:
void method(
// in/out
double *dOne,
...)
调用者有一个浮点指针
float *fOne;
使用method()
致电fOne
的好方法是什么?
method((double*)fOne, ...);
不是最好的,是吗?
答案 0 :(得分:2)
你永远不应该投射不同类型的指针。当指向类型具有不同的表示时,这种强制转换根本没有任何意义。例如,float
和void
可能没有相同的大小或表示形式,在这种情况下,两种类型之间的指针转换显然是不正确的。
但即使你知道不同的类型具有相同的表示,指针转换仍然不安全!由于strict aliasing rule,编译器可能会产生错误生成的代码,因为编译器可以自由地假设您永远不会通过不正确类型的指针访问给定数据。因此,它可能会优化部分代码。
施放任何给定指针是安全的:
char*
指针。uint8_t*
或char*
。指向指针转换的指针的所有其他情况都是错误,只要您访问指向的数据就会调用未定义的行为。包括从 const
转换到指向更大类型的指针。
(*)合格类型表示存在volatile
或int*
等限定符的类型。例如,将const int*
转换为{{1}}是安全的,但从不相反。