2016-08-15 57 views
-2

一些结构具有灵活的阵列:(版本4.9.2)为什么灵活的数组成员必须在结构的结尾,但结构与灵活的数组不是?

struct SomeArray { unsigned length; int array[]; }; 

此代码编译的gcc没有任何错误:

struct s1{ unsigned length; SomeArray some_array; const char * string; } ss1; 

如何工作的呢?

+0

gcc 4.8.2产生编译错误,因为'SomeArray'(注意不是'struct SomeArray')没有被定义。 – MikeCAT

+0

“这是如何工作的?” - 是的,怎么样?你编译时是否启用了警告? (虽然我希望有一个错误) – Olaf

+0

嗯,它的工作原因是GCC扩展? http://melpon.org/wandbox/permlink/23zsb6490RslWhV9 – MikeCAT

回答

1

从标准:

作为一个特殊的情况下,与一个以上的命名构件的结构的最后一个元件可以具有一个不完整的阵列类型;这被称为灵活阵列成员。在大多数情况下,灵活的阵列成员被忽略。特别是,结构的大小就好像是柔性阵列成员被省略,除了它可能具有比省略暗示的更多尾随填充。

这似乎是柔性阵列成员被忽略的情况之一。所以ss1.some_array的大小不包括ss1.some_array.array的空间。

+0

§6.7.2.1的¶3中有特定约束(您在同一节中引用了来自¶18的),其中说:_结构或联合不应包含具有不完整或函数类型的成员(因此, 结构不得包含它自己的一个实例,但可能包含一个指向它自己的实例 的指针),除了具有多于一个命名成员 的结构的最后一个成员可能具有不完整的数组类型;这样的结构(以及任何包含,可能递归地包含这样的结构的成员的联合)不应该是数组的结构或元素的成员。_ **不应该!** –