7

我在联合中声明了一个灵活的数组成员,如下所示:

#include  <stdio.h>

union ut
{
    int i;
    int a[]; // flexible array member
};

int main(void)
{
    union ut s;
    return 0;
}

并且编译器给出错误:

source_file.c:8:9: error: flexible array member in union
     int a[];

但是,声明数组大小为零,如下所示:

union ut
{
    int i;
    int a[0]; // Zero length array
};

它工作正常。

为什么零长度数组可以正常工作?

4

3 回答 3

9

不,联合不支持灵活的数组成员,只支持结构。C11 6.7.2.1 §18

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为 灵活数组成员

此外,零长度数组不是有效的 C,这是 gcc 非标准扩展。你让它工作的原因是因为你的编译器 gcc 被配置为编译“非标准 GNU 语言”的代码。如果您希望它为 C 编程语言编译代码,则需要添加编译器选项-std=c11 -pedantic-errors

于 2017-09-15T06:56:21.643 回答
8

int a[]是 C 标准符号(自C99起)。

int a[0]是早于 C99 的 GNU C 语法。其他编译器可能也支持它,我不知道。

您的编译器似乎默认为带有 GNU 扩展的 C90 标准,这就是为什么后者编译,但第一个编译的原因。

此外,正如Lundin 的回答中所述,标准 C 根本不支持灵活的数组成员union


尝试将-std=c99或添加-std=c11到您的编译器选项(此处为gcc文档)。

-pedantic或者也-pedantic-errors可能是一个好主意,它将强制执行更严格的标准合规性。

而且,除了强制性的,-Wall -Wextra也不会伤害...

于 2017-09-15T06:53:51.423 回答
0

我不确定标准对此会说什么,但 G++ 的联合似乎可以接受灵活的数组。如果您首先将它们包装在匿名结构中,如下所示:

union {
   unsigned long int  ul;
   char  fixed[4][2];
   struct {
      char  flexible[][2];
   };
};
于 2020-02-13T01:05:10.930 回答