Im struct scheint es richtig zu funktionieren. Er belegt jedoch trotzem teilweise mehr Bytes. Er scheint die Strukturen auf 4 Bytes zu "Alignen" vermutlich wegen der 32 Bit Struktur des verwendeten Prozessor.
Ja, das ist sehr oft so. Ich z.B. habe beruflich mit Blackfin DSPs von Analog Devices zu tun, und wenn man da versehentlich mal auf eine nicht durch 4 teilbare Addresse zugreift, stürzt der DSP sofort mit einer Exception ab.

Bei #pragma pack geht es übrigens in erster Linie nicht darum Speicher zu sparen, sondern darum ein ganz bestimmtes vorgegebenes Speicherlayout zu erzielen. Das kann insbesondere bei der Kommunikation wichtig sein. Ein Beispiel wäre etwa ein Ethernet Frame, bei dem ja ganz genau vorgegeben ist wie es aussehen muss, und da wäre es extrem kontraproduktiv, wenn so eine Struktur im Speicher irgendwelche Lücken hätte.