471,108 Members | 1,700 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,108 software developers and data experts.

Flexible size array

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?

--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cyberspace.org | don't, I need to know. Flames welcome.
Nov 15 '05 #1
2 10159
Christopher Benson-Manica wrote:
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

Nov 15 '05 #2
Robert Gamble wrote:
Christopher Benson-Manica wrote:
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
Nov 15 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by Christopher Benson-Manica | last post: by
10 posts views Thread by Adam Warner | last post: by
2 posts views Thread by DevarajA | last post: by
20 posts views Thread by mechanicfem | last post: by
2 posts views Thread by tobiasoed | last post: by
3 posts views Thread by Hallvard B Furuseth | last post: by
2 posts views Thread by =?Utf-8?B?Z2FkeWE=?= | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.