69,382
社区成员
发帖
与我相关
我的任务
分享
//这一小段程序是在《C语言深度解剖》中的一小段程序,没有给出说明
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int* ptr1 = (int*) (&a + 1);
int* ptr2 = (int*) ((int)a + 1);
printf("% x, % x", ptr1[-1], *ptr2);
return 0;
}
printf("% x, %x\n", ptr1[-1], *ptr2);
printf("% p, %x\n", *ptr2, *ptr2);
本质上来讲a[-1]就跟*(a-1)一样,所以是负数也无可后非了
http://blog.csdn.net/code_crash/article/details/4855000
可以看看这个博客里的 运算符的本质介绍!
1: //这一小段程序是在《C语言深度解剖》中的一小段程序,没有给出说明
2: int a[5] = {1, 2, 3, 4, 5};
3: int* ptr1 = (int*) (&a + 1);
4: int* ptr2 = (int*) ((int)a + 1);
5:
6: int t;
7: int main()
8: {
00401000 55 push ebp
00401001 8B EC mov ebp,esp
00401003 83 EC 40 sub esp,40h
00401006 53 push ebx
00401007 56 push esi
00401008 57 push edi
9: t=ptr1[-1];
00401009 A1 24 30 40 00 mov eax,[ptr1 (00403024)]
0040100E 8B 48 FC mov ecx,dword ptr [eax-4]
00401011 89 0D 40 30 40 00 mov dword ptr [t (00403040)],ecx
10: t=*ptr2;
00401017 8B 15 28 30 40 00 mov edx,dword ptr [ptr2 (00403028)]
0040101D 8B 02 mov eax,dword ptr [edx]
0040101F A3 40 30 40 00 mov [t (00403040)],eax
11: return 0;
00401024 33 C0 xor eax,eax
12: }
00401026 5F pop edi
00401027 5E pop esi
00401028 5B pop ebx
00401029 8B E5 mov esp,ebp
0040102B 5D pop ebp
0040102C C3 ret
00403010 01 00 00 00 02 00 00 00 03 00 00 ...........
0040301B 00 04 00 00 00 05 00 00 00
+ a 0x00403010
+ &a 0x00403010
a[5] 4206628
+ ptr1 0x00403024
+ ptr2 0x00403011
t 0
1: //这一小段程序是在《C语言深度解剖》中的一小段程序,没有给出说明
2: int main()
3: {
00401000 55 push ebp
00401001 8B EC mov ebp,esp
00401003 83 EC 60 sub esp,60h
00401006 53 push ebx
00401007 56 push esi
00401008 57 push edi
4: int a[5] = {1, 2, 3, 4, 5};
00401009 C7 45 EC 01 00 00 00 mov dword ptr [ebp-14h],1
00401010 C7 45 F0 02 00 00 00 mov dword ptr [ebp-10h],2
00401017 C7 45 F4 03 00 00 00 mov dword ptr [ebp-0Ch],3
0040101E C7 45 F8 04 00 00 00 mov dword ptr [ebp-8],4
00401025 C7 45 FC 05 00 00 00 mov dword ptr [ebp-4],5
5: int* ptr1 = (int*) (&a + 1);
0040102C 8D 45 00 lea eax,[ebp]
0040102F 89 45 E8 mov dword ptr [ebp-18h],eax
6: int* ptr2 = (int*) ((int)a + 1);
00401032 8D 4D ED lea ecx,[ebp-13h]
00401035 89 4D E4 mov dword ptr [ebp-1Ch],ecx
7:
8: int t;
9: t=ptr1[-1];
00401038 8B 55 E8 mov edx,dword ptr [ebp-18h]
0040103B 8B 42 FC mov eax,dword ptr [edx-4]
0040103E 89 45 E0 mov dword ptr [ebp-20h],eax
10: t=*ptr2;
00401041 8B 4D E4 mov ecx,dword ptr [ebp-1Ch]
00401044 8B 11 mov edx,dword ptr [ecx]
00401046 89 55 E0 mov dword ptr [ebp-20h],edx
11: return 0;
00401049 33 C0 xor eax,eax
12: }
0040104B 5F pop edi
0040104C 5E pop esi
0040104D 5B pop ebx
0040104E 8B E5 mov esp,ebp
00401050 5D pop ebp
00401051 C3 ret