2016-02-12 63 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的地址。