鱼C论坛

 找回密码
 立即注册
查看: 4969|回复: 4

函数的指针为什么不一样?

[复制链接]
发表于 2012-11-24 21:39:03 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 付笑 于 2012-11-24 21:44 编辑

#include<stdio.h>
int fun();
int main()
{
void *p;
p=fun;
fun();
printf("%d\n",p);
return 0;
}


int fun()

{
return 0;
}

问个问题,输出函数fun的指针p的值是4198405
但调试时fun的地址却是在00401090
请问这是怎么回事

下面是反汇编的代码



15:
16:   int fun()
17:   {
00401090   push        ebp                          这里是函数开始的地址 和上面输出的P值为什么不一样呢
00401091   mov         ebp,esp
00401093   sub         esp,40h
00401096   push        ebx
00401097   push        esi
00401098   push        edi
00401099   lea         edi,[ebp-40h]
0040109C   mov         ecx,10h
004010A1   mov         eax,0CCCCCCCCh
004010A6   rep stos    dword ptr [edi]
18:   return 0;
004010A8   xor         eax,eax
19:   }




最佳答案

查看完整内容

你编译的时候用的debug版本编译的吧? debug版本编译的程序函数调用都是通过跳转表调用的。 你的call 的地址是 jmp的地址, jmp才跳到函数真正入口处。所以你打印的p的值是jmp的地址 不是函数的真正入口。 要知道原理,就从调用函数的地方,单步跟踪下,看反汇编代码 就很清楚
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-24 21:39:04 | 显示全部楼层
你编译的时候用的debug版本编译的吧?  debug版本编译的程序函数调用都是通过跳转表调用的。
你的call 的地址是  jmp的地址, jmp才跳到函数真正入口处。所以你打印的p的值是jmp的地址  不是函数的真正入口。

要知道原理,就从调用函数的地方,单步跟踪下,看反汇编代码  就很清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-11-24 23:11:59 | 显示全部楼层
在声明处比较。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-24 23:17:30 | 显示全部楼层
知道原因了,是输出格式化问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-11-24 23:23:11 | 显示全部楼层
本帖最后由 望梅止渴 于 2012-11-24 23:43 编辑

那也不一样,jmp你试下。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-16 12:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表