代码之家  ›  专栏  ›  技术社区  ›  James Morris

对于指向结构及其第一个成员的指针,C标准怎么说?

  •  10
  • James Morris  · 技术社区  · 14 年前

    考虑以下两个问题 struct :

    struct a
    {
        int a;
    };
    
    struct b
    {
        struct a a_struct;
        int b;
    };
    

    以下实例 struct b :

    struct b b_struct;
    

    这种情况:

    if (&b_struct == (struct b*)&b_struct.a_struct)
        printf("Yes\n");
    

    C标准是否要求始终评估为真?

    3 回复  |  直到 14 年前
        1
  •  12
  •   Andrey    14 年前

    是的,根据6.7.2.1,“在结构对象中,非位字段成员和位字段所在的单元的地址按声明的顺序递增。指向结构对象的指针,经过适当转换后,指向其初始成员(或者如果该成员是位字段,则指向其所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头。”

        2
  •  5
  •   anon    14 年前

    在C标准中找不到它,但是答案是“是”——C++标准说:

    指向pod结构对象的指针, 使用a适当转换 重新解释了石膏,指向其 初始成员(或如果该成员是 位字段,然后到其中的单位 它存在),反之亦然。[注: 因此可能有未命名的 在pod结构对象中填充, 但不是在开始的时候,如有必要 以实现适当的对齐。]

    由于C和C++的POD对象必须兼容,所以C必须是相同的。

        3
  •  1
  •   Nyan    14 年前

    对。

    第一个成员前面不能有任何填充。

    结构的地址与其第一个成员的地址相同,前提是使用了适当的强制转换。

    resource