读书人

关于函数指针的疑问解决方法

发布时间: 2012-02-19 19:43:38 作者: rapoo

关于函数指针的疑问
关于函数指针的疑问

在消息传递的过程中,经常遇到call back 函数,使用函数指针来调用.

现在的问题时,我发现函数指针在传递的时候没有按照传值的规定.是把调用函数的备份传入了吗?请看下面的例子.

typedef int (*PF)();
PF regirster(PF pf);

PF regirster(PF pf)
{
return pf;
}

....

int funcA()

{

...

}

PF pfunc;

pfunc = regirster(funcA);


//这里出现的问题是:

funcA的地址是: 0x00401150

而 pf的值是 : 0x00401014

从而: pfunc的值是: 0x00401014


调用正确, 问题是:PF regirster(PF pf) 为什么传的值为什么不是funcA的地址??

[解决办法]
lz用的难道不是VC,跟VC好像啊。。。

@ILT+5(_funcA):
0040100A jmp funcA (00401060)
------------------------------------------
我只知道@ILT这样的东西在VC下好像跟增量链接有关,如果去掉项目的link increamentally
选项,就不是push offset @ILT+5(_funcA) (0040100a),而是push实际的地址了。


例如,我在去掉了增量链接选项后,情况如下:

50: int main()
51: {
00401380 55 push ebp
00401381 8B EC mov ebp,esp
00401383 83 EC 44 sub esp,44h
00401386 53 push ebx
00401387 56 push esi
00401388 57 push edi
00401389 8D 7D BC lea edi,[ebp-44h]
0040138C B9 11 00 00 00 mov ecx,11h
00401391 B8 CC CC CC CC mov eax,0CCCCCCCCh
00401396 F3 AB rep stos dword ptr [edi]
52: PF pfunc;
53: printf( "funcA: %d \n ", funcA); //函数的首地址
00401398 68 30 13 40 00 push offset funcA (00401330)
0040139D 68 2C A1 43 00 push offset string "funcA: %d \n " (0043a12c)
004013A2 E8 C9 E3 01 00 call printf (0041f770)
004013A7 83 C4 08 add esp,8


41: int funcA()
42: {
00401330 55 push ebp
00401331 8B EC mov ebp,esp
00401333 83 EC 40 sub esp,40h
00401336 53 push ebx
00401337 56 push esi
00401338 57 push edi
......

读书人网 >C语言

热点推荐