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