On Thu, Mar 30, 2006 at 01:03:15AM +0200, Joerg Schilling wrote: >Steve Bennett <[EMAIL PROTECTED]> wrote: > >> > After reading the C-99 Standard, it turned out that the last method >> > is the "official" way to prevent tail padding of structures. >> > >> > Could you please run the last test again but use: >> > >> > #pragma pack(1) >> > >> > struct test1 >> > { >> > char blerg[1]; >> > char type[4]; >> > char flibble[3]; >> > char more[2]; >> > char dummy[]; >> > }; >> > >> >> sizeof(test1) is 12 >> >> 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: --------------------------------------- [#12] Within a structure object, the non-bit-field members and the units in which bit-fields reside have addresses that increase in the order in which they are declared. A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. There may be unnamed padding within a structure object, but not at its beginning. ... [#14] There may be unnamed padding at the end of a structure or union. [#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 length.97) When an lvalue whose type is a structure with a flexible array member is used to access an object, it behaves as if that member were replaced with the longest array, with the same element type, that would not make the structure larger than the object being accessed; the offset of the array shall remain that of the flexible array member, even if this would differ from that of the replacement array. If this array would have no elements, then it behaves as if it had one element, but the behavior is undefined if any attempt is made to access that element or to generate a pointer one past it. ____________________ 97)The length is unspecified to allow for the fact that implementations may give array members different alignments according to their lengths. --------------------------------------- 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. -- Steve McIntyre, Cambridge, UK. [EMAIL PROTECTED] "Since phone messaging became popular, the young generation has lost the ability to read or write anything that is longer than one hundred and sixty characters." -- Ignatios Souvatzis -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]