C语言 填充嵌套结构

zc0qhyus  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(115)

在我的机器上,下面附的程序打印1,2,3,4。这是一般预期的行为吗,还是

struct {
    Vector position;
    Vector velocity;
    Vector acceleration;
};

字符串
不同于…的衬垫

struct {
    double x;
    double y;
    double dxdt;
    double dydt;
};


由于结构体的嵌套?通常,所有成员具有相同类型的结构:

struct {
 Type member1;
 Type member2;
 ... 
 Type memberN;
}


具有与嵌套结构相同的内存布局

struct {
 struct group1 { 
    Type member1;
    Type member2;
    ...
    Type memberI};
 };
 struct group2 { 
    Type memberIplus1;
    Type memberIplus2;
    ...
    Type memberIplusJ};
 };
 ...
 struct groupM {
    ...
    Type memberN
 };
}


附加程序:

#include <stdio.h>

typedef struct vector {
    double x;
    double y;
} Vector;

typedef union {
    struct {
        Vector position;
        Vector velocity;
        Vector acceleration;
    };
    struct {
        double x;
        double y;
        double dxdt;
        double dydt;
    };
} State;

int main() {
 State state = {
    .position = {1,2},
    .velocity = {3,4},
 };
 printf("%0.f\n",state.x);
 printf("%0.f\n",state.y);
 printf("%0.f\n",state.dxdt);
 printf("%0.f\n",state.dydt);
 return 1;
}

wztqucjr

wztqucjr1#

普通的C实现不会在同构结构(只包含单一类型成员的结构,包括数组、联合和直接或间接成员只属于该类型的结构)中插入任何填充。C标准允许这样做,但是,由于同构结构不需要填充来对齐,我知道插入填充的唯一原因是调试功能,以“模糊”程序(由于依赖于C标准没有保证的假设,试图触发错误行为)。
然后,由于访问一个union成员而不是最后一个存储的成员会将内存重新解释为新类型,因此访问state.x将获得为state.position.x存储的数据,其他成员也是如此。

8wigbo56

8wigbo562#

我相信这是允许的条款关于工会成员共享一个共同的初始序列,C11 6.5.2.3第6段
为了简化工会的使用,有一项特殊保证:如果一个联合体包含几个共享公共初始序列的结构(见下文),并且如果联合体对象当前包含这些结构中的一个,则允许在联合体的完整类型的声明可见的任何地方检查它们中的任何一个的公共初始部分。两个结构共享一个公共的初始序列,如果对应的成员对于一个或多个初始成员的序列具有兼容的类型(并且,对于位字段,具有相同的宽度)。
由于两个结构都以4个double成员开始,这是一个“公共初始序列”,因此您可以存储到其中一个成员中,然后从另一个成员的相应成员中读取。

相关问题