具有灵活数组成员的结构只有在动态分配时才能真正正确使用。例如:
struct s1 {
int a;
int b;
int c[];
};
...
struct s1 *x = malloc(sizeof(struct s1) + 5 * sizeof(int));
让我们假设典型的结构填充和sizeof(int)==4
. 那会让sizeof(struct s1)==8
.
现在想象如果这样的结构是另一个结构的成员:
struct s2 {
int a;
struct s1 b;
int c;
};
的b
成员struct s2
将从偏移量 4 开始。但是c
成员呢?鉴于此sizeof(struct s1)==8
,这将使成员c
具有偏移量 12。但是,该b
成员无法为其包含的成员留出任何空间c
。
因为给定结构成员的偏移量是在编译时设置的,所以无法c
为struct s1
.
理论上,如果具有灵活数组成员的结构是最后一个成员:
struct s2 {
int a;
int b;
struct s1 c;
};
然后它可以工作,但随后意味着它struct s2
也受到与具有灵活数组成员的结构相同的规则,从而导致级联效应。这将使确定哪些结构受此规则约束变得更加困难。
因此,具有灵活数组成员的结构不允许作为另一个结构或数组的成员。