调用回调函数,数组参数地址偏移出错
在下面程序中(*func)(arrlist)函数无法正常调用而GetMaxBook(arrlist)函数可以正常调用,经过调试发现func回调函数再获取arrlist数组的地址时出现错误,地址少偏移了4个字节这是为什么?该如何解决?
C代码及相关汇编代码如下:
typedef void* (*fun)(void *arrlist);struct book{ int id; char name[10];};void *Max(void * arrlist,fun func);struct book GetMaxBook(BOOK b);54: void *Max(void * arrlist,fun func) 55: { 004135E0 55 push ebp 004135E1 8B EC mov ebp,esp 004135E3 81 EC D8 00 00 00 sub esp,0D8h 004135E9 53 push ebx 004135EA 56 push esi 004135EB 57 push edi 004135EC 8D BD 28 FF FF FF lea edi,[ebp-0D8h] 004135F2 B9 36 00 00 00 mov ecx,36h 004135F7 B8 CC CC CC CC mov eax,0CCCCCCCCh 004135FC F3 AB rep stos dword ptr es:[edi] 56: (*func)(arrlist);//func为GetMaxBook函数指针004135FE 8B F4 mov esi,esp 00413600 8B 45 08 mov eax,dword ptr [arrlist] 00413603 50 push eax 00413604 FF 55 0C call dword ptr [func] 00413607 83 C4 04 add esp,4 0041360A 3B F4 cmp esi,esp 0041360C E8 20 DB FF FF call @ILT+300(__RTC_CheckEsp) (411131h) 57: GetMaxBook(arrlist);00413611 8B 45 08 mov eax,dword ptr [arrlist] 00413614 50 push eax 00413615 8D 8D 2C FF FF FF lea ecx,[ebp-0D4h] 0041361B 51 push ecx 0041361C E8 B5 DB FF FF call @ILT+465(_GetMaxBook) (4111D6h) 00413621 83 C4 08 add esp,8 58: return NULL;00413624 33 C0 xor eax,eax } 35: struct book GetMaxBook(BOOK b) 36: { 38: struct book maxb; 39: maxb = *b;00413748 8B 45 0C mov eax,dword ptr [ebp+0Ch] ;如GetMaxBook(arrlist)为0x00000001则func为0x000000040041374B 8B 08 mov ecx,dword ptr [eax] 0041374D 89 4D DC mov dword ptr [ebp-24h],ecx 00413750 8B 50 04 mov edx,dword ptr [eax+4] 00413753 89 55 E0 mov dword ptr [ebp-20h],edx 00413756 8B 48 08 mov ecx,dword ptr [eax+8] 00413759 89 4D E4 mov dword ptr [ebp-1Ch],ecx 0041375C 8B 50 0C mov edx,dword ptr [eax+0Ch] 0041375F 89 55 E8 mov dword ptr [ebp-18h],edx
#include <stdio.h>typedef struct book{ int id; char name[10];} *BOOK;typedef void* (*fun)(BOOK arrlist);void *GetMaxBook(BOOK b){ printf("id=%d name=%s\n", b->id, b->name); return NULL;}void *Max(void *arrlist,fun func){ (*func)(arrlist); GetMaxBook(arrlist); return NULL;}int main(){ struct book list[2] = { {1, "book1"}, {2, "book2"} }; BOOK arrlist = list; Max(arrlist, GetMaxBook); return 0;}