Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is scanf("%hhu", char*) overwriting other variables when they are local?

Tags:

c

gcc

gcc4.7

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
like image 690
Daniel Castro Avatar asked Apr 05 '13 03:04

Daniel Castro


1 Answers

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).

like image 59
R.. GitHub STOP HELPING ICE Avatar answered Oct 19 '22 09:10

R.. GitHub STOP HELPING ICE