[英]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.