I suspect that you are on an architecture that insists that a long() must begin on a word boundary (the address%4 = 0). When you inserted the char(), you moved the next available memory position off of a word boundary, and so you get the three slack-bytes inserted. If you positively must have the smallest in-memory foot-print, then order the components of your struct in order of decreasing alignment -- float/double before long before half-word before int/char/byte.