C语言中结构体指针强制转换访问成员是否为标准特性?
结构体指针跨类型转换的合法性(C标准层面)
这种把struct B*强制转换为struct A*来访问成员的写法,是C语言的标准特性,完全符合C标准规定,并非编译器专属的非标准扩展。
标准依据
C标准明确规定:如果一个结构体的第一个成员是另一个结构体类型,那么指向外层结构体的指针与指向该第一个成员的指针,在转换后是等价的——两者指向的内存地址完全相同,不存在偏移。也就是说,(struct A*)&b和&b.super是完全等价的表达式,通过前者访问field_2和直接访问b.super.field_2的效果一致,不会触发未定义行为。
代码验证(你的示例)
struct A { int field_1; int field_2; }; struct B { struct A super; }; int main() { struct B b; // 常规访问方式 b.super.field_2 = 10; // 标准允许的转换访问方式 struct A* generic_ref = (struct A*)&b; generic_ref->field_2 = 10; return 0; }
注意事项
- 只有当被嵌套的结构体是外层结构体的第一个成员时,这种转换才合法。如果
struct B中super前面还有其他字段(比如int id; struct A super;),此时强制转换就会导致指针指向错误的内存区域,属于未定义行为。 - 这种写法是C语言中模拟“继承”特性的常用手段,在底层开发、嵌入式框架中广泛使用,所有符合C标准的编译器(比如GCC、Clang、MSVC)都支持该特性,无需担心跨编译器兼容性问题。
内容的提问来源于stack exchange,提问作者Tonaion
相关产品推荐
相关产品推荐

