The practice of using variable sized structures that began with type and size info and ended with a char[1] was commonplace.
https://hex-rays.com/blog/igors-tip-of-the-week-94-variable-...
Good True C Programmers had guard rails | canary bytes | etc. to detect and avoid actual buffer overflow (into unallocated memory) rather than technical buffer overflow (reading|writing past the end of a char|byte array).