Почему scanf («% hhu», char *) перезаписывает другие переменные, когда они локальные?
Название говорит само за себя. Я использую GCC 4.7.1 (в комплекте с CodeBlocks), и я столкнулся со странной проблемой. Учти это:
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;
}
Для входов 1, 2 и 3 это выходы
a = 1, b = 0, c = 0
a = 0, b = 2, c = 0
a = 0, b = 0, c = 3
Если я, однако, объявляю a, b и c глобальными переменными, это работает как ожидалось. Почему это происходит?
заранее спасибо
Другие детали:
Я использую Windows 8 64 бит. Я также попытался с -std = c99, и проблема сохраняется.
Дальнейшие исследования
Тестирование этого кода
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;
}
показывает, что scanf интерпретирует "% hhu" как "% u". Это напрямую игнорирует «чч». Вывод кода со входом 1:
255 255 255 255 255 255 255 255
1 0 0 0 255 255 255 255