一次铸造两次

mus*_*afa 5 c casting

在一个项目中我看到了以下行,我不明白两次投射的原因.

*((MY_STRUCT_T*)(void *)cp->down.common) = *(cp->dpr);
Run Code Online (Sandbox Code Playgroud)

两次铸造的原因是什么?为什么不直接投射到MY_STRUCT_T*?


添加更多细节:

typedef union download_s {
    MY_STRUCT_1_T *a1;
    MY_STRUCT_2_T *a2;
    void         *common;
} download_t;

typedef struct cp_s {
 ...
 MY_STRUCT_T *dpr;
 ...
} cp_t;
Run Code Online (Sandbox Code Playgroud)

alk*_*alk 1

如果cp->down.common已经void *强制转换为后者(“内部”强制转换为(void *))是不必要的。

这可以完成这项工作:

*((MY_STRUCT_T *) cp->down.common) = *(cp->dpr);
Run Code Online (Sandbox Code Playgroud)

一种不同的情况是,如果cp->down.common声明了intptr_t,那么确实需要通过void *(如OP所示),因为 onlyvoid *保证适合intptr_t

C 标准说:

[intptr_t] 指定一个有符号整数类型,其属性是任何有效的void指针都可以转换为该类型,然后转换回void指针,结果将与原始指针进行比较