C compiler relocates pointer that overlaps another variable -
i doing experiments see how c allocates variables on stack. getting odd behavior following code. c appears growing stack downward, in following example, char c allocated in byte before short s. create int pointer bigrandp , point @ same location occupied c, "int" sees overlaps space on stack occupied s. try assign location referenced int pointer.
unsigned short namesum = 0; unsigned char smallrand = 0; unsigned int* bigrandp; //the "int" pointed ip should overlap s bigrandp = (unsigned int*)(&smallrand); printf("%p %p %p\n", &namesum, &smallrand, bigrandp); printf("%u %u %u\n", smallrand, namesum, *bigrandp); *bigrandp = 0; printf("%p %p %p\n", &namesum, &smallrand, bigrandp); printf("%u %u %u\n", smallrand, namesum, *bigrandp); 0028ff1a 0028ff19 0028ff19 0 0 419430400 0028ff1a 0028ff19 0028ff00 0 0 4210788 the printed results interesting. not assignment fail (the int pointed bigrandp not set 0), int pointer silently relocated point somewhere else further down stack. going on? c compiler's way of keeping me overwriting other variables overlapping pointers?
bigrandp pointer unsigned int.
you pointed unsigned char object, modified unsigned int object bigrandp points to.
apparently smallrand , bigrandp stored close each other in memory. trying modify sizeof (unsigned int) bytes of 1-byte object, clobbered part of pointer object itself.
bottom line: program's behavior undefined.
also, though isn't related behavior you're seeing, %p format requires void* argument. if want print other type of pointer, should convert void*:
printf("%p %p %p\n", (void*)&namesum, (void*)&smallrand, (void*)bigrandp); it's "work" or without casts on systems pointers have same representation, version casts more correct on systems.
Comments
Post a Comment