Why is scanf("%hhu", char*) overwriting other variables when they are local?
c, gcc, gcc4.7
Solution
The important detail is that you're using Windows, and presumably an outdated or non-conforming C environment (compiler and standard library). MSVCRT only supports C89 (and even then, not entirely correctly); in particular, there was no "hh" modifier in C89, and it's probably interpreting "hh" the same as "h" (i.e. `short`).
Problem
The title says it all. I'm using GCC 4.7.1 (bundled with CodeBlocks) and I faced a strange issue. Consider this: ``` 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; } ``` For inputs 1, 2 and 3, this outputs ``` a = 1, b = 0, c = 0 a = 0, b = 2, c = 0 a = 0, b = 0, c = 3 ``` If I, however, declare a, b and c as global variables, it works as expected. Why is this happenning? Thank you in advance Other details: I'm running Windows 8 64 bits. I also tried with -std=c99 and the problem persists. Further research Testing this code ``` 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; } ``` shows that scanf is interpreting "%hhu" as "%u". It is directly ignoring the "hh". The output of the code with input 1 is: ``` 255 255 255 255 255 255 255 255 1 0 0 0 255 255 255 255 ```