Next: Structure Assignment, Previous: Flexible Array Fields, Up: Structures [Contents][Index]
Be careful about using different structure types to refer to the same memory within one function, because GNU C can optimize code assuming it never does that. See Aliasing. Here’s an example of the kind of aliasing that can cause the problem:
struct a { int size; char *data; };
struct b { int size; char *data; };
struct a foo;
struct b *q = (struct b *) &foo;
Here q points to the same memory that the variable foo
occupies, but they have two different types. The two types
struct a and struct b are defined alike, but they are
not the same type. Interspersing references using the two types,
like this,
p->size = 0; q->size = 1; x = p->size;
allows GNU C to assume that p->size is still zero when it is
copied into x. The compiler “knows” that q points to
a struct b and this cannot overlap with a struct a.
Other compilers might also do this optimization. The ISO C standard considers such code erroneous, precisely so that this optimization will be valid.