我应该避免施放指针吗?

时间:2016-03-09 08:21:40

标签: c pointers casting

我在C中有一个方法,它需要一个双指针作为参数:

void method(
    // in/out
    double *dOne,
    ...)

调用者有一个浮点指针

float *fOne;

使用method()致电fOne的好方法是什么?

method((double*)fOne, ...);

不是最好的,是吗?

1 个答案:

答案 0 :(得分:2)

你永远不应该投射不同类型的指针。当指向类型具有不同的表示时,这种强制转换根本没有任何意义。例如,floatvoid可能没有相同的大小或表示形式,在这种情况下,两种类型之间的指针转换显然是不正确的。

但即使你知道不同的类型具有相同的表示,指针转换仍然不安全!由于strict aliasing rule,编译器可能会产生错误生成的代码,因为编译器可以自由地假设您永远不会通过不正确类型的指针访问给定数据。因此,它可能会优化部分代码。

施放任何给定指针是安全的:

  • 指向同一限定类型(*)的指针。
  • 指向相同类型的指针,但指定了更多限定符(*)。
  • 往返于char*指针。
  • 到空指针。
  • 指向字节整数类型的指针,例如uint8_t*char*

指向指针转换的指针的所有其他情况都是错误,只要您访问指向的数据就会调用未定义的行为。包括从 const转换到指向更大类型的指针。

(*)合格类型表示存在volatileint*等限定符的类型。例如,将const int*转换为{{1}}是安全的,但从不相反。