¿Por qué scanf ("% hhu", char *) sobrescribe otras variables cuando son locales?

El título lo dice todo. Estoy usando GCC 4.7.1 (incluido con CodeBlocks) y enfrenté un problema extraño. Considera esto:

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 las entradas 1, 2 y 3, esta salida

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

Sin embargo, si yo declaro a, byc como variables globales, funciona como se espera. ¿Por qué sucede esto?

Gracias de antemano

Otros detalles:

Estoy ejecutando Windows 8 64 bits. También probé con -std = c99 y el problema persiste.

Más investigación

Probando este codigo

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;
}

muestra que scanf está interpretando "% hhu" como "% u". Se está ignorando directamente el "hh". La salida del código con entrada 1 es:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta