Does union support flexible array members?

5.6k Views Asked by At

I have declared a flexible array member in union, like this:

#include  <stdio.h>

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

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

and compiler gives an error :

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

But, Declared array zero size like this :

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

And it's working fine.

Why does zero length array work fine union?

3

There are 3 best solutions below

0
On BEST ANSWER

No, unions do not support flexible array members, only structs. C11 6.7.2.1 §18

As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.

In addition, zero-length arrays is not valid C, that's a gcc non-standard extension. The reason why you get this to work is because your compiler, gcc, is configured to compile code for the "non-standard GNU language". If you would rather have it compile code for the C programming language, you need to add compiler options -std=c11 -pedantic-errors.

4
On

int a[] is the C standard notation (since C99).

int a[0] is GNU C syntax, which predates C99. Other compilers might also support it, I don't know.

Your compiler seems to default to C90 standard with GNU extensions, which is why latter compiles, but first one does.

Furthermore, as stated in Lundin's answer, standard C does not support flexible array members in union at all.


Try adding -std=c99 or -std=c11 to your compiler options (gcc docs here).

Also -pedantic or -pedantic-errors is probably a good idea too, it'll enforce more strict standard compliance.

And, obligatory aside, -Wall -Wextra won't hurt either...

1
On

I'm not sure what the standard would say about this, but G++' unions seems to accept flexible arrays just fine. If you wrap them in an anonymous struct first, like so:

union {
   unsigned long int  ul;
   char  fixed[4][2];
   struct {
      char  flexible[][2];
   };
};