我试图了解C中的低级内存管理器,特别是Stack.据我所知,当一个函数被调用时,一个返回地址被推入堆栈.然后是局部变量.
所以我写了一个小程序来调查这个.这是我的计划:
#includevoid TestStack(); void DoTestStack() { char x1 = 1; char x2 = 2; char x3 = 3; char x4 = 4; char *x = &x4; printf("TestStack: %08X\n", (&TestStack)); printf("\n"); int i; x = &x4; for(i = 0; i < 32; i++) printf("%02d: %08X : %08X\n", i, *(x + i), *(x - i)); printf("\n"); printf("x1: %02X\n", x1); printf("x2: %02X\n", x2); printf("x3: %02X\n", x3); printf("DONE!!!\n"); } void TestStack() { DoTestStack(); } void main() { TestStack() ; }
基本上,它调查位置x4之前和之后的所有内存.这应该很好地覆盖了返回地址的位置.
但我似乎无法找到任何类似于返回地址的字节.
这是我的结果:
TestStack: 08048B49 00: 00000004 : 00000004 01: 00000003 : FFFFFFBF 02: 00000002 : FFFFFFAC 03: 00000001 : FFFFFFED 04: 00000004 : 0000001C 05: FFFFFFC3 : 00000000 06: FFFFFFB9 : 00000000 07: 00000000 : 00000000 08: FFFFFFF4 : 00000008 09: FFFFFFBF : 00000000 10: FFFFFFB9 : FFFFFF90 11: 00000000 : FFFFFFBD 12: 00000038 : 00000020 13: FFFFFFED : 00000000 14: FFFFFFAC : 00000000 15: FFFFFFBF : 00000000 16: 00000054 : 00000000 17: FFFFFF8B : 00000000 18: 00000004 : FFFFFFFF 19: 00000008 : 00000000 20: 00000045 : 00000008 21: 00000073 : 00000000 22: FFFFFFA7 : 00000000 23: 00000000 : 00000000 24: 00000020 : 00000017 25: FFFFFFBD : 00000008 26: FFFFFF90 : 00000004 27: 00000000 : FFFFFF8C 28: 00000048 : FFFFFFCF 29: FFFFFFED : 00000008 30: FFFFFFAC : 00000004 31: FFFFFFBF : FFFFFF8A x1: 01 x2: 02 x3: 03 DONE!!!
我在这里错过了什么?有人可以解释一下.
无论如何,我在Ubuntu 9.10上.
提前致谢.:-D
你正在查看各个字符,然后将它们转换为32位整数,这让你感到困惑.返回地址位于这四行的最低有效字节中:
16: 00000054 : 00000000 17: FFFFFF8B : 00000000 18: 00000004 : FFFFFFFF 19: 00000008 : 00000000
即你的返回地址是0x08048b54.
试试这个:
uint32_t *x; x = (uint32_t *)&x4; for(i = 0; i < 32; i++) printf("%02d: %08X : %08X\n", i, *(x + i), *(x - i));