In a word: boundary alignment. ID is an unsigned int and MAJOR, an enum, also defaults to an int datatype. Ints are 4-byte fields that are naturally aligned on four byte boundarys. Therefore the compiler places the int fields on four byte boundarys. Doubles go on an eight byte boundary. If the struct does not have the fields ordered in descend size of datatypes, (doubles, ints, short ints and finally char/char array), then the compiler silently inserts unreachable filler alignment bytes. Doubles, ints, etc. are boundary aligned to improve register load performance. On certain types of machines fetching unaligned data can cause an execption. You can use a #pragma to modify the default boundary alighment. You can see the result of what the compiler has done by generating a listing that details the struct. Offset length Field 0 10 name 10 2 unreachable filler inserted by the compiler 12 4 ID 16 1 sex 17 3 unreachable filler inserted by the compiler 20 4 major Total length=24 Sam