2016-02-12 64 views
4

是否有可能在一个结构中有两个灵活大小的数组?C中的嵌套动态结构?

我知道我可以做类似下面

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

但我的问题是,我们可以做一些像下面?

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

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

如果上述问题很难实现,还有没有其他的方法可以解决这种情况?

+0

您通常会在这里使用动态分配,除非有某些原因不适用。 –

+1

这是不可能的,'countC'的偏移无法在编译时知道。零大小的数组无论如何都是GCC扩展,并且在C99中已经被实际的灵活大小的数组所取代,而语法略有不同。 –

+0

最简单的解决方法是为数组使用数组指针,这些指针独立于'struct'分配。 –

回答

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