typedef struct _person { char* name, ... } *person; typedef struct _record { int a, person *p ....} *record; int new_person(person *out_person_freeable, char *name....); int free_person(person p); int new_record(record *out_record, ....); int free_record(record r); /* free the contained person too */ int record_get_person(record r, person *out_person_notfreeable); /* out_person_notfreeable is owned by the record object and must not be freed */