2017-07-14 30 views
2

我想將& add1的值賦給一個變量。我嘗試了this answer,的建議,但它沒有給出我期望的結果。向UINTPTR_T投射功能的地址給了我不正確的結果

uintptr_t add1Address = reinterpret_cast<uintptr_t>(&add1); 

在這一點上,add1Address等於11669784,這是0x00B21118

但是我的調試器,(和檢查用HXD內存)告訴我,& ADD1 = 0x00B217C0

這裏發生的事情?

的完整代碼如下

#include "stdafx.h" 
#include <iostream> 

int add1(int num, int num2); 

int add1(int num, int num2) 
{ 
     return num + num2; 
} 

int main(void) 
{ 

    uintptr_t add1Address = reinterpret_cast<uintptr_t>(&add1); 
    std::cout << std::hex << add1Address; 

} 

我所看到的在debugger這裏

+0

你使用哪種編譯器? – geza

+0

@geza visual studio,刪除了printf;使問題更清楚,不打印。 – JeffUK

+0

「然而,我的調試器(用HxD檢查內存)告訴我......」 - 它究竟如何告訴你這一點?很可能你會跳到一些毫無根據的假設。正確的值確實是「0x00B21118」。 – AnT

回答

1

讓我來猜猜。

這是因爲也許你有增量鏈接。

看看這個:c++ function addresses coming out different in attached profiler library than in the subject code base

+0

我不這麼認爲:'否(/ INCREMENTAL:NO)'但是它所指的內存區域確實包含一個跳轉指令。實際上任何函數似乎都會返回一個類似指令的地址: – JeffUK

+0

@JeffUK:那麼,「跳轉指令」就是函數的實際起點,所以上面的代碼給出了一個完全正確的結果。那麼問題是什麼? – AnT

+0

答案是,視覺工作室沒有顯示'我的功能的真正開始' – JeffUK

1

在你所得到的地址是跳轉到調試器顯示的地址。這允許該功能被重定向。

例如:

add1: 
00B211EF jmp   add1 (0B21730h) 

add1Address值將是0x00B211EF,但Visual Studio將顯示0x00B21730add()地址。