Q:

Por que o tamanho de uma struct não é a soma dos tamanhos de suas variáveis?

Por exemplo, o código a seguir:
#include <stdio.h>

struct exemplo{
    char letra;
    int numero;
    float flutuante;
};

int main()
{
    printf("Tamanho do char: %u\n", sizeof(char));
    printf("Tamanho do int: %u\n", sizeof(int));
    printf("Tamanho do float: %u\n", sizeof(float));
    printf("Tamanho da struct: %u\n", sizeof(struct exemplo));
}

Mostra no console:
Tamanho do char: 1
Tamanho do int: 4
Tamanho do float: 4
Tamanho da struct: 12

Ou seja, o tamanho da struct é 12 e não 9 (1+4+4) como esperado.
Por que isso acontece?

A:

Na verdade a estrutura pode ter o mesmo tamanho que a soma de seus membros. Depende do alinhamento. Se os membros permitem montar a estrutura de forma alinhada terá o mesmo tamanho.
O caso apresentado realmente obriga alinhar o tipo char para uma palavra, então há um desperdício de espaço. Isso é chamado de padding. Os bytes usados para o padding não são usados, indicam nada. E não há problema algum nisso, é o normal. É feito assom por questões de performance. Na maioria dos casos o compilador sabe fazer melhor que o programador.
Se precisar de algo diferente pode ser resolvido com #pragma pack(1) ou __attribute__((packed)). Mais informações podem ser obtidas na resposta linkada acima. Raramente isso é realmente necessário e é melhor não mexer nisto se não entender todas as implicações que terá.

