2012-05-10 85 views
3

下面的代码有效吗?在另一个结构中具有一个灵活数组成员的结构

struct foo { 
    int a; 
    int b[]; 
}; 

struct bar { 
    int c; 
    struct foo d; 
}; 

struct bar *x = malloc(sizeof(struct bar) + sizeof(int [128])); 

它似乎确定给我,但我有点怀疑,因为如果我这样做编译器不抱怨:

struct bar { 
    struct foo d; 
    int c; 
}; 
+1

@Shahbaz:否,'INT B []'是*不*一样'INT * B'。这个构造被称为*灵活数组成员*。 http://www.c-faq.com/struct/structhack.html – jamesdlin

+0

@ jamesdlin,不知道!但这似乎是一个可怕的想法。他们怎么能使它成为标准? – Shahbaz

+0

@Shahbaz这不是一个可怕的想法,如果人们错误地使用它,那就很危险。在成为标准之前,将长度为1的数组作为'struct'的最后一个成员用于此目的是一种常见的攻击。 gcc很早就接受了长度为0的数组作为灵活的数组成员。 –

回答

5

这是不行的。节6.7.2.1(在n1570),点3表示

3所述的结构或联合不得含有具有不完整或功能类型的成员(因此, 的结构不应含有自己的一个实例,但也可以含有一个指向它本身的实例 的指针),除了具有多于一个命名成员 的结构的最后一个成员可能具有不完整的数组类型;这样的结构(以及任何包含,可能是递归地包含这种结构的成员的联合)不应该是数组的结构或元素的成员。

因此,具有灵活数组成员的struct可能不是另一个结构的一部分。

(它可能很好地工作作为一个结构的最后一个部件,但是,如果编译器接受它。)

相关问题