Next: , Previous: , Up: Structures   [Contents][Index]

15.12 Overlaying Different Structures

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 a *p = &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 GNU C compiler “knows” that q points to a struct b and this is not supposed to 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 not be incorrect.