Flexible size array

  • Thread starter Christopher Benson-Manica
  • Start date
C

Christopher Benson-Manica

Is the following program conforming under C99?

#include <stdio.h>

typedef struct foo {
int bar;
int baz[];
} foo;

foo foos[]={
{ 1, {1,2,3} }
};

int main() {
return 0;
}

gcc -Wall -pedantic -std=c99 (3.3.3 for cygwin) accepts the program
without the declaration for the array of foo structs, but issues an
error about "initialization of a flexible array member in a nested
context" on the program above. Is it correct?
 
R

Robert Gamble

Christopher said:
Is the following program conforming under C99?

#include <stdio.h>

typedef struct foo {
int bar;
int baz[];
} foo;

foo foos[]={
{ 1, {1,2,3} }
};

int main() {
return 0;
}

No, it's not. It is a constraint violation for a structure containing
a flexible array to be a member of a structure or an array.

I also don't think that you can initialize the flexible array part in
the declaration so something like this wouldn't work either:

foo foo1 = { 1, {1, 2, 3} };

although this would be okay:

foo foo1 = {1};
gcc -Wall -pedantic -std=c99 (3.3.3 for cygwin) accepts the program
without the declaration for the array of foo structs, but issues an
error about "initialization of a flexible array member in a nested
context" on the program above. Is it correct?

It is correct that there is a problem with your code. I think the
particular error message you are referring to has to do with the fact
that that gcc allows static initialization of flexible arrays as well
as an array of structures containing flexible array member. Because of
this, things get complicated when you try to statically initialize such
an array so gcc disallows this.

Robert Gamble
 
A

akarl

Robert said:
Christopher said:
Is the following program conforming under C99?

#include <stdio.h>

typedef struct foo {
int bar;
int baz[];
} foo;

foo foos[]={
{ 1, {1,2,3} }
};

int main() {
return 0;
}


No, it's not. It is a constraint violation for a structure containing
a flexible array to be a member of a structure or an array.

I also don't think that you can initialize the flexible array part in
the declaration so something like this wouldn't work either:

foo foo1 = { 1, {1, 2, 3} };

although this would be okay:

foo foo1 = {1};

gcc -Wall -pedantic -std=c99 (3.3.3 for cygwin) accepts the program
without the declaration for the array of foo structs, but issues an
error about "initialization of a flexible array member in a nested
context" on the program above. Is it correct?


It is correct that there is a problem with your code. I think the
particular error message you are referring to has to do with the fact
that that gcc allows static initialization of flexible arrays as well
as an array of structures containing flexible array member. Because of
this, things get complicated when you try to statically initialize such
an array so gcc disallows this.

Moreover, according to the standard the signature of `main' should be either

int main(void)

or

int main(int argc, char *argv[])

(Guess Java makes people forget `void' in C function headers with empty
parameter lists.)


August
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,226
Latest member
KristanTal

Latest Threads

Top