Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

It's valid C to cast a structure to the type of its first element. So in the example of

  struct child {
    struct parent {
      int z;
    } p;
  } foo;
you can access foo.p.z but not foo.z -- but you can access (struct parent *)(&foo)->z, so you can pass foo to anything which expects a struct parent.


I'll assume you're right. Thanks for pointing that out. Your C sounds fresher than mine. I used it heavily from 90-95 or so but later moved on to higher languages like Java and Python. If what you point out about the syntax is accurate, I find that to be a counter-intuitive design decision.


It works because C structs are just contiguous bits of memory, interpreted as various fields. A pointer to a struct points to the start of that contiguous bit of memory.

  Child Struct:
  +---------------+-----------------+
  | parent struct | child fields    |
  +---------------+-----------------+
  ^
  \--- pointers to the struct point at the start
You can cast this child struct to a parent struct, which is like saying 'interpret memory starting here as a 'parent' struct'.

This works: The memory from location to location+sizeof(parent) IS a parent struct. The child fields following the parent struct are simply ignored.


It works because C structs are just contiguous bits of memory, interpreted as various fields

Well... almost. C structs can have internal padding -- but the C standard doesn't allow padding before the first element, so that first element is guaranteed to begin at the beginning of the struct.


Thanks! You learn something every day :)




Consider applying for YC's Fall 2026 batch! Applications are open till July 27.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: