- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
- #include <stdio.h>
- int main(int argc, char* argv[])
- {
- int a[4] = {1,2,3,4};
- int *ptr1 = (int*)(&a+1);//4
- int *ptr2 = (int*)((int)a+1);//20000000 把a强制变为整数+1
- /*
- 00401000 /$ 83EC 10 sub esp,0x10
- 00401003 |. C74424 00 010>mov dword ptr ss:[esp],0x1
- 0040100B |. C74424 04 020>mov dword ptr ss:[esp+0x4],0x2
- 00401013 |. 8B4424 01 mov eax,dword ptr ss:[esp+0x1]
- 00401017 |. 6A 02 push 0x2
- 00401019 |. 50 push eax
- 0040101A |. 6A 04 push 0x4
- 0040101C |. 68 30704000 push xueAn.00407030 ; ASCII "%x--%x--%x
- "
- 00401021 |. E8 0A000000 call xueAn.00401030
- 00401026 |. 33C0 xor eax,eax
- 00401028 |. 83C4 20 add esp,0x20
- 0040102B \. C3 retn
- dd esp
- 0018FF38 00000800
- 0018FF3C 00000001
- 0018FF40 00000002
- 0018FF44 00401B9C 返回到 xueAn.00401B9C 来自 xueAn.00401C5B
- 0018FF48 00407000 xueAn.00407000
- dd esp+1
- 0018FF35 0000401A
- 0018FF39 01000008
- 0018FF3D 02000000
- 0018FF41 9C000000
- 0018FF45 0000401B
- */
- int *ptr3 = (int*)(a+1);//2
- /*x86下 4---20000000---2 原因在于小端存储 ptr2指向了数组第二项“末尾”这个“末尾”不是真的末尾是真正意义上第二项开始地址,但由于是小端存储,先把2塞到了真正意义上的开始地址(想象下OD数据窗口)
- 于是就变成了02000000然后就会输出2000000
- /*
- 内存分布如下
- 0x0001 --------0x0002---------0x0003-----------0x0004
- 01000000 02000000 03000000 04000000
- */
- printf("%x--%x--%x\n",ptr1[-1],*ptr2,*ptr3 );
- return 0;
- }
复制代码 |
|