初始字段布局相同的不同结构体,能否安全跨类型访问修改?
结论:该操作符合C标准,是安全合法的
依据C99及后续版本的标准规定:
- 当两个结构体的初始字段序列类型、顺序和对齐要求完全一致时,将其中一个结构体的指针转换为另一个结构体的指针,仅访问这些公共初始字段的行为,属于定义良好的行为。
- 标准明确:指向结构体的指针可合法转换为指向其第一个成员的指针;同理,初始字段序列匹配的结构体之间,这种跨类型指针转换后访问公共字段的操作,不会触发未定义行为。
关键注意点
- 字段必须严格匹配:除了类型和顺序一致,编译器对字段的填充字节也必须相同——只要字段类型和顺序符合要求,符合标准的编译器会保证初始序列的内存布局一致。
- 仅操作公共初始字段:绝对不能通过转换后的指针访问第二个结构体的额外字段,这属于未定义行为,可能导致程序崩溃或逻辑异常。
- 可读性优先:这种写法虽然合法,但会降低代码的可维护性,后续开发者容易误解代码意图。更推荐的做法是提取公共字段为独立结构体,再嵌入到两个结构体中:
struct CommonFields { int num; char *str; int *lst; unsigned int num_lst; }; struct Athis { struct CommonFields common; // Athis专属字段 }; struct Bthat { struct CommonFields common; char *b_not_b; bool b_hamlet; long guildenst; unsigned long rosencr; };
通过b.common.num的方式访问公共字段,代码意图更清晰,也更符合编码规范。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

