Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does union support flexible array members?

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?

like image 524
msc Avatar asked Sep 15 '17 06:09

msc


2 Answers

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.

like image 152
Lundin Avatar answered Nov 06 '22 13:11

Lundin


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...

like image 23
hyde Avatar answered Nov 06 '22 14:11

hyde