具有灵活数组成员的结构只有在动态分配时才能真正正确使用。例如:
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也受到与具有灵活数组成员的结构相同的规则,从而导致级联效应。这将使确定哪些结构受此规则约束变得更加困难。
因此,具有灵活数组成员的结构不允许作为另一个结构或数组的成员。