Search code examples
ctypescastingctypetypecasting-operator

Why the variable becomes zero?


Test is on Linux 32bit:

I found a bug in my C code and I simplify the code and put it here:

#define al *(char*)(eax_ptr)
int eax = 0;
int *eax_ptr = &eax;
int edx = 0;
char hh = 254;
.......

eax = hh;
edx = al;

The problem is that, edx should be 254 but where I use gdb to debug, I fould edx equal zero.

Could anyone give me some help on this problem..?

Thank you!


Solution

  • The result of this code is not predictable. The initialization

    char hh = 254;

    Is not assured to be successful on every platform. char may not be able to hold 254 (and it is not if your platform uses signed chars and 8 bit characters, a common choice).

    Assuming that a char can hold a value such as 254, this assignment:

    eax = hh;

    Will expand hh to the size of an integer by inserting leading zeros. When you later interpret eax (an integer) as if it were a char (which is really what you're doing with the cast), the result will depend on your machine's endianness: if it's little endian, it will read 254, otherwise, it will read 0.