C中的嵌套动态结构?

时间:2016-02-12 23:11:40

标签: c arrays data-structures struct

在一个结构中是否可以有两个灵活大小的数组?

我知道我可以做下面的事情

struct A {
    int countB;
    struct B[0];
}

但我的问题是我们可以做下面的事吗?

struct A {
    int countB;
    struct B[0];
    int countC;
    struct C[0];
}

如果是,我们如何获得countC的偏移?

如果上述内容很难实施,还有其他方法可以解决这类问题吗?

1 个答案:

答案 0 :(得分:3)

不,每个数据结构不允许多个灵活大小的数组:

  

6.7.2.1.16:作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这被称为灵活的阵列成员。

灵活数组成员必须是最后一个成员的原因是否则无法计算任何成员的偏移量(相对于struct的初始成员的地址的字节数)遵循灵活的阵列成员。

在您的情况下,可以进行变通,但需要在灵活成员之前存储额外的指针,并指向CB的位置:

struct A {
    int countB;
    int countC;
    struct some_struct *C;
    struct some_struct B[0];
};

分配struct A时,您需要分配额外的countB+countC大小。会员C需要设置为B+countB的地址。