struct-or-union-specifier: struct-or-union identifieropt { struct-declaration-list } struct-or-union identifier
struct-or-union: struct union
struct-declaration-list: struct-declaration struct-declaration-list struct-declaration
struct-declaration: specifier-qualifier-list struct-declarator-list ;
specifier-qualifier-list: type-specifier specifier-qualifier-listopt type-qualifier specifier-qualifier-listopt
struct-declarator-list: struct-declarator struct-declarator-list , struct-declarator
struct-declarator: declarator declaratoropt : constant-expression
1381 A structure or union shall not contain a member with incomplete or function type (hence, a structure shall not contain an instance of itself, but may contain a pointer to an instance of itself), except that the last member of a structure with more than one named member may have incomplete array type;
1382 such a structure (and any union containing, possibly recursively, a member that is such a structure) shall not be a member of a structure or an element of an array.
1383
The expression that specifies the width of a bit-field shall be an
integer constant expression that has a nonnegative value that shall
not exceed the
1384 If the value is zero, the declaration shall have no declarator.
1385
A bit-field shall have a type that is a qualified or unqualified
version of
1386 As discussed in 6.2.5, a structure is a type consisting of a sequence of members, whose storage is allocated in an ordered sequence, and a union is a type consisting of a sequence of members whose storage overlap.
1387 Structure and union specifiers have the same form.
1388
1389 The presence of a struct-declaration-list in a struct-or-union-specifier declares a new type, within a translation unit.
1390 The struct-declaration-list is a sequence of declarations for the members of the structure or union.
1391 If the struct-declaration-list contains no named members, the behavior is undefined.
1392
The type is incomplete until after the
1393 A member of a structure or union may have any object type other than a variably modified type.103)
1394 In addition, a member may be declared to consist of a specified number of bits (including a sign bit, if any).
1395 Such a member is called a bit-field;104)
1396 its width is preceded by a colon.
1397 A bit-field is interpreted as a signed or unsigned integer type consisting of the specified number of bits.105)
1398
If the value 0 or 1 is stored into a nonzero-width bit-field of type
1399 An implementation may allocate any addressable storage unit large enough to hold a bit-field.
1400 If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit.
1401 If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined.
1402 The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined.
1403 The alignment of the addressable storage unit is unspecified.
1404 A bit-field declaration with no declarator, but only a colon and a width, indicates an unnamed bit-field.106)
1405 As a special case, a bit-field structure member with a width of 0 indicates that no further bit-field is to be packed into the unit in which the previous bit-field, if any, was placed.
1406 103) A structure or union can not contain a member with a variably modified type because member names are not ordinary identifiers as defined in 6.2.3.
1407
104) The unary
1408 thus, there are no pointers to or arrays of bit-field objects.
1409
105) As specified in 6.7.2 above, if the actual type specifier used
is
1410 106) An unnamed bit-field structure member is useful for padding to conform to externally imposed layouts.
1411 Each non-bit-field member of a structure or union object is aligned in an implementation-defined manner appropriate to its type.
1412 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.
1413 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.
1414 There may be unnamed padding within a structure object, but not at its beginning.
1415 The size of a union is sufficient to contain the largest of its members.
1416 The value of at most one of the members can be stored in a union object at any time.
1417 A pointer to a union object, suitably converted, points to each of its members (or if a member is a bit-field, then to the unit in which it resides), and vice versa.
1418 There may be unnamed padding at the end of a structure or union.
1419 As a special case, the last element of a structure with more than one named member may have an incomplete array type;
1420 this is called a flexible array member.
1421
1422
1423
1424 the offset of the array shall remain that of the flexible array member, even if this would differ from that of the replacement array.
1425 If this array would have no elements, 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.
1426
EXAMPLE
struct s { int n; double d[]; };
struct ss { int n; double d[1]; };
sizeof (struct s)
offsetof(struct s, d)
offsetof(struct ss, d)
If
struct s *s1;
struct s *s2;
s1 = malloc(sizeof (struct s) + 64);
s2 = malloc(sizeof (struct s) + 46);
and assuming that the calls to
struct { int n; double d[8]; } *s1;
struct { int n; double d[5]; } *s2;
Following the further successful assignments:
s1 = malloc(sizeof (struct s) + 10);
s2 = malloc(sizeof (struct s) + 6);
they then behave as if the declarations were:
struct { int n; double d[1]; } *s1, *s2;
and:
double *dp;
dp = &(s1->d[0]); // valid
*dp = 42; // valid
dp = &(s2->d[0]); // valid
*dp = 42; // undefined behavior
The assignment:
*s1 = *s2;
only copies the member
struct s t1 = { 0 }; // valid
struct s t2 = { 2 }; // valid
struct ss tt = { 1, { 4.2 }}; // valid
struct s t3 = { 1, { 4.2 }}; // invalid: there is nothing for the 4.2 to initialize
t1.n = 4; // valid
t1.d[0] = 4.2; // undefined behavior
1427
1428 Forward references: tags (6.7.2.3).
Next
Created at: 2005-06-29 02:19:01
The text from WG14/N1124 is copyright © ISO