C 为什么灵活数组成员必须位于结构的末尾,而具有灵活数组的结构则不能?

C 为什么灵活数组成员必须位于结构的末尾,而具有灵活数组的结构则不能?,c,arrays,struct,C,Arrays,Struct,一些具有灵活数组的结构: struct SomeArray { unsigned length; int array[]; }; 此代码gcc(4.9.2版)编译时没有错误: struct s1{ unsigned length; SomeArray some_array; const char * string; } ss1; 这是如何工作的?来自标准: 作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,将忽略flexibl

一些具有灵活数组的结构:

struct SomeArray { unsigned length; int array[]; };
此代码gcc(4.9.2版)编译时没有错误:

struct s1{ unsigned length; SomeArray some_array; const char * string; } ss1;
这是如何工作的?

来自标准:

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,将忽略flexible数组成员。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾部填充


这似乎是忽略灵活数组成员的情况之一。因此
ss1.some\u array
的大小不包括
ss1的空间。some\u array.array

gcc 4.8.2产生编译错误,因为没有定义
SomeArray
(注意,not
struct SomeArray
)。“这是如何工作的?”-是的,如何工作的?编译时是否启用了警告?(尽管我预计会有一个错误)嗯,它是因为GCC扩展而工作的吗@米凯卡特:那个链接不能正常工作。无论如何,你是对的。另一个没有.Questions的问题寻求调试帮助(“此代码为什么不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中复制它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整且可验证的示例。§6.7.2.1第3节中有一个特定约束(您在同一节中引用了第18节),该约束规定:结构或联合不应包含不完整或功能类型的成员(因此,结构不应包含自身的实例,但可以包含指向自身实例的指针),除非具有多个命名成员的结构的最后一个成员可能具有不完整的数组类型;此类结构(以及可能递归地包含此类结构成员的任何并集)不应成为结构的成员或阵列的元素。你不应!