You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:23:14