Bad news!

sizeof(test1) is 12
offsetof(test1, more) is 8
offsetof(test1, dummy) is 10

I suppose this is the bit you are referring to:
  the  size
  of  the  structure  shall be equal to the offset of the last
  element of an otherwise identical  structure  that  replaces
  the  flexible  array  member  with  an  array of unspecified
  length.97)

That 'of unspecified length' might well account for this behaviour.

Cheers,
Steve


Joerg Schilling wrote:
Steve McIntyre <[EMAIL PROTECTED]> wrote:


And just in case you are wondering, I ran all those previous tests again
with -std=c99 with exactly the same results.

Thank you for the test!

So GCC is in clear violation with the C-99 standard.

Which part of the C-99 standard, exactly? Section 6.7.2.1, paragraph
#12,#14,#15 (see draft N869 from
http://cbfalconer.home.att.net/download/n869_txt.bz2) says the
following:

---------------------------------------

...

 [#15] 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, and the  size
 of  the  structure  shall be equal to the offset of the last
 element of an otherwise identical  structure  that  replaces
 the  flexible  array  member  with  an  array of unspecified
---------------------------------------


i.e. there may be no padding before the first member of a structure,
but there may be elsewhere within the structure including right at the
end. As a special case, if you specify the last member of your
structure as a "flexible array member" then there will be no padding
_at the end of the structure_. It does not affect padding _within_ the
structure.

I'm sorry, I don't see anything here to support your assertion that
gcc is behaving incorrectly.


Could you please run a final test?

I would like to see the offset of "dummy" in the structure (e.g. via
the offsetof() macro from <stddef.h>).

I am sure that GCC will _not_ introduce padding _before_ "dummy" and the C-99 stanad requires that sizeof (struct test) == offsetof(struct test, dummy);

Jörg


Reply via email to