Unix up until at least System III used the structure thing to do the equivalent to unions, before unions were a thing - for example each disk driver had a data structure that began with a common part and then had a per-device part, generic parts of the kernel used a generic structure that only represented the generic data structure, drivers used their own version.
I think part of this is that early Cs didn't have a full type system, there were limits to the types you could describe (the ones you couldn't were mostly a bit esoteric and not very useful) - from memory in the original PCC types were encoded in the compiler as words rather than trees (pdp11 memory was scarce)
Unix up until at least System III used the structure thing to do the equivalent to unions, before unions were a thing - for example each disk driver had a data structure that began with a common part and then had a per-device part, generic parts of the kernel used a generic structure that only represented the generic data structure, drivers used their own version.
I think part of this is that early Cs didn't have a full type system, there were limits to the types you could describe (the ones you couldn't were mostly a bit esoteric and not very useful) - from memory in the original PCC types were encoded in the compiler as words rather than trees (pdp11 memory was scarce)