在C中的struct指针之间转换

iom*_*ome 15 c casting

请考虑以下代码.

typedef struct{
    int field_1;
    int field_2;
    int field_3;
    int field_4;

    uint8_t* data;
    uint32_t data_size;
} my_struct;

void ext_function(inalterable_my_struct* ims, ...);
Run Code Online (Sandbox Code Playgroud)

我想允许ext_function(由第三方书面)仅修改field_3field_4my_struct.所以我做了以下事情:

typedef struct{
    const int field_1;
    const int field_2;
    int field_3;
    int field_4;

    const uint8_t* data;
    const uint32_t data_size;
} inalterable_my_struct;

void ext_function(inalterable_my_struct* ims, ...);
Run Code Online (Sandbox Code Playgroud)

在调用之间my_structinalterable_my_struct之前转换指针是否安全ext_function(如下所示)?

void call_ext_function(my_struct* ms){
    inalterable_my_struct* ims = (inalterable_my_struct*)ms;
    ext_function(ims, ...);
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 7

我不认为这是个好主意.

被调用的函数总是可以抛弃任何const:ness,并根据需要修改数据.

如果您可以控制调用点,最好创建一个副本并使用指向该副本的指针调用该函数,然后复制您关注的两个字段:

void call_ext_function(my_struct* ms)
{
    my_struct tmp = *ms;
    ext_function(&tmp, ...);
    ms->field_3 = tmp.field_3;
    ms->field_4 = tmp.field_4;
}
Run Code Online (Sandbox Code Playgroud)

更清洁,除非你每秒数千次这样做,否则性能损失应该是微不足道的.

如果函数触及它,你可能也必须伪造基于指针的数据.