Por que o scanf (“% hhu”, char *) sobrescreve outras variáveis ​​quando elas são locais?

O título diz tudo. Estou usando o GCC 4.7.1 (junto com CodeBlocks) e enfrentei um problema estranho. Considere isto:

int main() {
    unsigned char a = 0, b = 0, c = 0;
    scanf("%hhu", &a);
    printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
    scanf("%hhu", &b);
    printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
    scanf("%hhu", &c);
    printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
    return 0;
}

Para as entradas 1, 2 e 3, esta saída

a = 1, b = 0, c = 0
a = 0, b = 2, c = 0
a = 0, b = 0, c = 3

Se eu, no entanto, declarar a, b e c como variáveis ​​globais, isso funcionará como esperado. Por que isso está acontecendo?

Agradeço antecipadamente

Outros detalhes:

Estou executando o Windows 8 64 bits. Eu também tentei com -std = c99 e o problema persiste.

Mais pesquisa

Testando este código

void printArray(unsigned char *a, int n) {
    while(n--)
        printf("%hhu ", *(a++));
    printf("\n");
}

int main() {
    unsigned char array[8];
    memset(array, 255, 8);
    printArray(array, 8);
    scanf("%hhu", array);
    printArray(array, 8);
    return 0;
}

mostra que scanf está interpretando "% hhu" como "% u". Está ignorando diretamente o "hh". A saída do código com entrada 1 é:

255 255 255 255 255 255 255 255
1 0 0 0 255 255 255 255

questionAnswers(1)

yourAnswerToTheQuestion