accessing initial common structure members
    Richard Tobin 
    richard at aiai.ed.ac.uk
       
    Tue Oct 23 04:39:28 AEST 1990
    
    
  
In article <1990Oct21.051028.11018 at zoo.toronto.edu> henry at zoo.toronto.edu (Henry Spencer) writes:
> It is dubious practice at best.
This technique is often used where an object may be of several different
kinds, with a type field to distinguish them.  For example:
   enum type {number, cons};
   struct number {enum type type; int value;};
   struct cons   {enum type type; union obj *car, *cdr;}; 
   union obj {struct number; struct cons;};
An alternative, of course, is to do it like this:
   struct number {double value;};
   struct cons   {struct obj *car, *cdr;};
   struct obj {enum type type; 
               union {struct cons cons; struct number number;} value;};
But if you want to allocate only the necessary amount of space when
creating a "number" object, the first form is simpler (you allocate
sizeof(struct number) and cast its address to a (union obj *), whereas
with the second form I think you would have to use something like
offsetof(struct obj, value) + sizeof(struct number)).
I would be interested to hear of elegant, portable ways to do this.
-- Richard
-- 
Richard Tobin,                       JANET: R.Tobin at uk.ac.ed             
AI Applications Institute,           ARPA:  R.Tobin%uk.ac.ed at nsfnet-relay.ac.uk
Edinburgh University.                UUCP:  ...!ukc!ed.ac.uk!R.Tobin
    
    
More information about the Comp.lang.c
mailing list