為什么VS監視的函數地址和輸出的函數地址不同?
#include<iostream>
using namespace std;
void gf(){ cout<<"::gf()"; }
typedef void(*F)();
int main()
{
gf();
F f=gf;
printf("%p \n",f);//輸出的是00434F55
system("pause");
}
VS2005下斷點,添加監視:

為什么輸出的函數地址和VS監視到的不同?
答:輸出的是跳轉指令的地址,監視到的是函數地址.
兩條指令緊挨著執行,一般輸出的都是跳轉表的地址,而不是函數的絕對地址
以下是VS下斷點后,調試/窗口/反匯編 顯示的匯編代碼:
……
;跳轉表: (本行是本人加的)
std::locale::id::operator unsigned int:
00434F50 jmp std::locale::id::operator unsigned int (43D8F0h)
gf:
00434F55 jmp gf (4377C0h)
DName::isValid:
00434F5A jmp DName::isValid (4845D0h)
……
void gf(){ cout<<"::gf()"; }
004377C0 push ebp
004377C1 mov ebp,esp
……
gf();
0043783E call gf (434F55h)
F f=gf;
00437843 mov dword ptr [f],offset gf (434F55h)
……
system("pause");
0043785B push offset string "pause" (4A2098h)
00437860 call @ILT+2850(_system) (434B27h)
00437865 add esp,4
……