為什么VS監(jiān)視的函數(shù)地址和輸出的函數(shù)地址不同?
#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下斷點,添加監(jiān)視:

為什么輸出的函數(shù)地址和VS監(jiān)視到的不同?
答:輸出的是跳轉(zhuǎn)指令的地址,監(jiān)視到的是函數(shù)地址.
兩條指令緊挨著執(zhí)行,一般輸出的都是跳轉(zhuǎn)表的地址,而不是函數(shù)的絕對地址
以下是VS下斷點后,調(diào)試/窗口/反匯編 顯示的匯編代碼:
……
;跳轉(zhuǎn)表: (本行是本人加的)
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
……