在C中安全铸造

时间:2011-05-23 09:04:34

标签: c casting

大家好,我有这段代码:

void writer(void* param){
    if(NULL == param){
        return;
    }
    param = (param_t*)param;
...
}

它是安全的代码,或者不是,param来自类型param_t *,但是当我在函数中使用它时,我每次都在做什么生病,有人有另一个优雅的解决方案吗?提前谢谢

4 个答案:

答案 0 :(得分:5)

这是一个奇怪的无操作。

定义函数时,您说param的类型为void* 然后,使用演员表,您明确地将其转换为param_t*
并且编译器使用赋值隐式地将param_t*转换为void*

您需要另一个变量

void writer(void *param) {
    param_t *internal_param;

    if (NULL == param) return;
    internal_param = param;
    /* ... */
}

答案 1 :(得分:2)

您不必将void *转换为C中的另一个指针类型。

所以就这样做:

void writer(void* param){
   param_t *myparam;
    if(NULL == param){
        return;
    }
    myparam = param;
...
}

(但你为什么还要为参数使用void *?)

答案 2 :(得分:2)

即使指针值为NULL,赋值中的(隐式)强制转换也是安全的,因此不需要推迟它。你可以这样做:

void writer(void* param)
{
  param_t* myparam = param;

  if (myparam == NULL)
    return;

  ...
}

答案 3 :(得分:1)

显而易见的解决方案是避免使用void *并改为使用param_t *,如:

void writer(param_t * param)
{
  if (param == NULL)
  {
    return;
  }

  ...
}

如果知道它从未使用NULL指针调用,则可以删除NULL测试。或者,您可以将其替换为assert(param != NULL)