¿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