【问题标题】:Nested dynamic structure in C?C中的嵌套动态结构?
【发布时间】:2016-02-12 23:11:40
【问题描述】:

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

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

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

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

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

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

如果上面的方法很难实现,还有其他容易解决的吗?

【问题讨论】:

  • 你通常会在这里使用动态分配,除非有什么理由不这样做。
  • 不可能,countC 的偏移量在编译时是未知的。无论如何,零大小数组都是 GCC 扩展,并且在 C99 中已被实际的灵活大小数组所取代,其语法略有不同。
  • 最简单的解决方案是对数组使用数组指针,独立于struct分配。

标签: c arrays data-structures struct


【解决方案1】:

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

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的地址。

【讨论】:

    猜你喜欢
    • 2021-08-08
    • 2019-06-27
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多