70,023
社区成员




#include "stdio.h"
int main()
{
int array[10]={214,4654,6,76,5};
int (*ptr)[10];
ptr = &array;
int* ptr1 = (int*)(ptr+1);
printf("ptr:0x%p,ptr1:0x%p,offset:%d\n",ptr,ptr1,(int)ptr1-(int)ptr);
//ptr:0x0012FF20,ptr1:0x0012FF48,offset:40
return 0;
}
//ptr+1 以后,指向的地址相对于ptr来说,偏移了40个字节,说明ptr是指向了一个10个元素的整形数组
//关键的问题搞明白后,接下来的那些分析应该没问题了
1: int array[10]={214,4654,6,76,5};
2: int (*ptr)[10];
3: void *pv;
4: int main() {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h
00401016 push ebx
00401017 push esi
00401018 push edi
5: ptr=&array;
00401019 mov dword ptr [ptr (00414554)],offset array (00414410)
6: pv=(void *)( array);
00401023 mov dword ptr [pv (00414558)],offset array (00414410)
7: pv=(void *)(&array);
0040102D mov dword ptr [pv (00414558)],offset array (00414410)
8: pv=(void *)( ptr );
00401037 mov eax,[ptr (00414554)]
0040103C mov [pv (00414558)],eax
9: pv=(void *)( *ptr );
00401041 mov ecx,dword ptr [ptr (00414554)]
00401047 mov dword ptr [pv (00414558)],ecx
10: pv=(void *)( **ptr );
0040104D mov edx,dword ptr [ptr (00414554)]
00401053 mov eax,dword ptr [edx]
00401055 mov [pv (00414558)],eax
11: pv=(void *)( ptr++ );
0040105A mov ecx,dword ptr [ptr (00414554)]
00401060 mov dword ptr [pv (00414558)],ecx
00401066 mov edx,dword ptr [ptr (00414554)]
0040106C add edx,28h
0040106F mov dword ptr [ptr (00414554)],edx
12: pv=(void *)( *(ptr++));
00401075 mov eax,[ptr (00414554)]
0040107A mov [pv (00414558)],eax
0040107F mov ecx,dword ptr [ptr (00414554)]
00401085 add ecx,28h
00401088 mov dword ptr [ptr (00414554)],ecx
13: pv=(void *)( *ptr++ );
0040108E mov edx,dword ptr [ptr (00414554)]
00401094 mov dword ptr [pv (00414558)],edx
0040109A mov eax,[ptr (00414554)]
0040109F add eax,28h
004010A2 mov [ptr (00414554)],eax
14: pv=(void *)( (*ptr)+1);
004010A7 mov ecx,dword ptr [ptr (00414554)]
004010AD add ecx,4
004010B0 mov dword ptr [pv (00414558)],ecx
15: pv=(void *)(** ptr++ );
004010B6 mov edx,dword ptr [ptr (00414554)]
004010BC mov eax,dword ptr [edx]
004010BE mov [pv (00414558)],eax
004010C3 mov ecx,dword ptr [ptr (00414554)]
004010C9 add ecx,28h
004010CC mov dword ptr [ptr (00414554)],ecx
16: pv=(void *)(**(ptr++));
004010D2 mov edx,dword ptr [ptr (00414554)]
004010D8 mov eax,dword ptr [edx]
004010DA mov [pv (00414558)],eax
004010DF mov ecx,dword ptr [ptr (00414554)]
004010E5 add ecx,28h
004010E8 mov dword ptr [ptr (00414554)],ecx
17: return 0;
004010EE xor eax,eax
18: }
004010F0 pop edi
004010F1 pop esi
004010F2 pop ebx
004010F3 mov esp,ebp
004010F5 pop ebp
004010F6 ret
1: int array[10]={214,4654,6,76,5};
2: int (*ptr)[10];
3: void *pv;
4: int main() {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h
00401016 push ebx
00401017 push esi
00401018 push edi
5: ptr=&array;
00401019 mov dword ptr [ptr (00414554)],offset array (00414410)
6: pv=(void *)( array);
00401023 mov dword ptr [pv (00414558)],offset array (00414410)
7: pv=(void *)(&array);
0040102D mov dword ptr [pv (00414558)],offset array (00414410)
8: pv=(void *)( ptr );
00401037 mov eax,[ptr (00414554)]
0040103C mov [pv (00414558)],eax
9: pv=(void *)( *ptr );
00401041 mov ecx,dword ptr [ptr (00414554)]
00401047 mov dword ptr [pv (00414558)],ecx
10: pv=(void *)( **ptr );
0040104D mov edx,dword ptr [ptr (00414554)]
00401053 mov eax,dword ptr [edx]
00401055 mov [pv (00414558)],eax
11: pv=(void *)( ptr++ );
0040105A mov ecx,dword ptr [ptr (00414554)]
00401060 mov dword ptr [pv (00414558)],ecx
00401066 mov edx,dword ptr [ptr (00414554)]
0040106C add edx,28h
0040106F mov dword ptr [ptr (00414554)],edx
12: pv=(void *)( *(ptr++));
00401075 mov eax,[ptr (00414554)]
0040107A mov [pv (00414558)],eax
0040107F mov ecx,dword ptr [ptr (00414554)]
00401085 add ecx,28h
00401088 mov dword ptr [ptr (00414554)],ecx
13: pv=(void *)( *ptr++ );
0040108E mov edx,dword ptr [ptr (00414554)]
00401094 mov dword ptr [pv (00414558)],edx
0040109A mov eax,[ptr (00414554)]
0040109F add eax,28h
004010A2 mov [ptr (00414554)],eax
14: pv=(void *)( (*ptr)+1);
004010A7 mov ecx,dword ptr [ptr (00414554)]
004010AD add ecx,4
004010B0 mov dword ptr [pv (00414558)],ecx
15: pv=(void *)(** ptr++ );
004010B6 mov edx,dword ptr [ptr (00414554)]
004010BC mov eax,dword ptr [edx]
004010BE mov [pv (00414558)],eax
004010C3 mov ecx,dword ptr [ptr (00414554)]
004010C9 add ecx,28h
004010CC mov dword ptr [ptr (00414554)],ecx
16: pv=(void *)(**(ptr++));
004010D2 mov edx,dword ptr [ptr (00414554)]
004010D8 mov eax,dword ptr [edx]
004010DA mov [pv (00414558)],eax
004010DF mov ecx,dword ptr [ptr (00414554)]
004010E5 add ecx,28h
004010E8 mov dword ptr [ptr (00414554)],ecx
17: return 0;
004010EE xor eax,eax
18: }
004010F0 pop edi
004010F1 pop esi
004010F2 pop ebx
004010F3 mov esp,ebp
004010F5 pop ebp
004010F6 ret