From: scjones@thor.sdrc.com (Larry Jones)
Newsgroups: comp.std.c
Subject: Re: Structure walking
Date: 26 Jan 93 15:44:26 GMT

In article <1993Jan25.213543.25499@pony.Ingres.COM>, mikes@Ingres.COM (Mike Schilling) writes:
> Question 1:  Are the following assumptions valid for all C compilers?
> For (c)-(f), assume that the structure contains only scalar members.
> 
> (a) Each scalar type has an unambiguous alignment requirement.

True, but the compiler may choose to use a stricter alignment than is
actually required.

> (b) Each scalar type's alignment requirement is a power of two.

False.  The Standard contains no such guarantee.

> (c) The offset of the first member of a structure is 0.

True.  ANSI 3.5.2.1 Structure and Union Specifiers:
	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
	therefore be unnamed padding within a structure object, but not
	at its beginning, as necessary to achieve the appropriate
	alignment.

> (d) The offset of the (n+1)th member of a structure is the offset of
>     the nth member of the structure, plus the size of the nth member,
>     rounded up to the alignment requirement of the type of the (n+1)th member.

False.  ANSI 3.5.2.1 (emphasis mine):
	Each non-bit-field member of a structure or union object is
	aligned in an implementation-defined manner *appropriate* to its
	type.
Note that it says "appropriate to", not "required by".  An
implementation has a great deal of latitude in how it aligns members.

> (e) The alignment required by the structure is equal to the most restrictive
>     alignment of any of its members.

True, but see (a).

> (f) The size of the structure is the offset of the last member of the structure,
>     plus the size of the last member, rounded up to alignment required
>     by the structure.

False.  ANSI 3.5.2.1 again:
	There may also be unnamed padding at the end of a structure or
	union, as necessary to achieve the *appropriate* alignment were
	the structure or union to be an element of an array.
Again, it says "appropriate", not "required".

> Question 2:  Can the assumptions in question 1 be generalized to include
> structures which contain nested structures?  Equivalently: if we "flatten"
> a structure (eliminate all nesting), will that leave its size, alignment
> requirements, and the offsets of its scalar members unchanged?

The answers don't change if you allow nested structures but, since your
assumptions don't hold, you can't flatten a structure and expect its
size, alignment, and member offsets to remain the same.

> Question 3:  On at least one platform (Data General MV series minis),
> pointers to characters were represented diferently from pointers to anything
> else (really a byte pointer vs. word pointer distinction), so you had 
> to be very careful about how you cast pointers. 
> On such platforms, how are pointers to structures represented?  Does 
> it depend on the type of the structure?

It is generally reguarded as true that the Standard contains sufficient
requirements scattered about its various sections to require that all
structure pointers have the same representation.  There is no guarantee
that this representation is identical to the representation of any other
pointer type, however.
----
Larry Jones, SDRC, 2000 Eastman Dr., Milford, OH  45150-2789  513-576-2070
larry.jones@sdrc.com
If I get a bad grade, it'll be YOUR fault for not doing
the work for me! -- Calvin