Los compiladores alinean automaticamente los datos, insertando bytes de relleno para asegurar que cada miembro este alineado correctamente para un acceso mas rapido a ellos.
typedef struct
{
char a;
char relleno[3]; // para completar 4 bytes
int b;
char c;
char relleno[3]; //para completar 4 bytes
} A;
typedef struct
{
char a;
char c;
char relleno[2]; //para completar 4 bytes
int b;
} B;
Una instancia de una estructura tendra la alineacion de su miembre de mayor número bytes. Puedes evitar la alineación usando la directiva
#pragma pack(1) pero no es recomendable porque podría tener un severo impacto en el rendimiento