簡體   English   中英

為什么函數的地址(地址的低位字)在每次執行中總是相同

[英]Why Address (lower word of address) of a function is always same in every execution

我在main()中做了以下代碼

int (*Addition)(int x, int y) = FuncAdd;

cout<<endl<<"Address of Addition is: "<<Addition<<endl;

現在,每次我執行它。 我得到這樣的價值:

補充地址是:01161450

加法地址是:001B1450

加法地址是:00F91450

等等..

正如我們所看到的,地址每次都不同,盡管它們之間都有一個共同的低位字(1450-H)。 那么背后的原因是什么呢?

函數的地址由編譯器和鏈接器相對於程序空間的開始定義。 但是,操作系統可以自由地從所需的任何位置開始加載程序,並且由於地址空間布局隨機化 ,它將隨每次運行而改變。 看來您的操作系統使用的起始地址是0x10000的倍數。

操作系統將內存分為幾個分區。 如果每個分區都從xxxx0000 H開始,則表明FuncAdd()段是在1450 H內存位置之后分配的。 由於其他函數和其他聲明的長度變化,它可能會有所不同,因為先前分配的段確定FuncAdd()的起始段地址。

原因是,操作系統正在為程序分配與平面內存模型不同的內存位置。 因此,FuncAdd()的地址可以每次更改。 先前分配的空間最終將由加載程序回收/重用。 如果您在內存模型為虛擬的操作系統(例如Linux / Unix)中嘗試此操作,則應該始終為FuncAdd()獲得相同的值。我還添加了另一個函數FuncAdd2()進行說明。

在Linux上嘗試一下:

int FuncAdd (int x, int y){ return 0;}
int FuncAdd2 (int x, int y){return 0;}
typedef  int (*fp)(int, int);
fp Addition[2];
    int main()
    {

        Addition[0] = FuncAdd;
        Addition[1] = FuncAdd2;
        printf("\nAddress of *addition is %X " , Addition[0] );
        printf("\nAddress of *addition1 is %X\n ", Addition[1]);
    }

您將獲得此SAME(在類似OS的Linux中)* addition的地址為80483E4 <<這是proc的相對地址,並且保持不變* addition1的地址為80483EE <

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM