为什么函数的地址(较低的地址字)在每次执行时总是相同的

时间:2014-02-26 17:59:57

标签: c++ pointers visual-c++ operating-system function-pointers

我在main()

中制作了以下代码
int (*Addition)(int x, int y) = FuncAdd;

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

现在每次都执行它。我得到这样的价值观:

  

增加地址是:01161450

     

增加的地址是:001B1450

     

增加地址是:00F91450

依旧......

正如我们所看到的,每次地址都不同,尽管所有这些地方都有较低的单词(1450-H)。那背后的原因是什么?

3 个答案:

答案 0 :(得分:5)

函数的地址由编译器和链接器相对于程序空间的开头定义。但是,操作系统可以随意在任何需要的地方加载程序,由于Address Space Layout Randomization,它会随着每次运行而改变。您的操作系统似乎使用的起始地址是0x10000的倍数。

答案 1 :(得分:1)

操作系统将内存划分为多个分区。如果每个分区都从xxxx0000 H开始, 您的FuncAdd()段似乎是在1450 H内存位置之后分配的。它可能因其他函数和其他声明的长度变化而有所不同,因为先前分配的段确定了FuncAdd()的起始段地址。

答案 2 :(得分:1)

原因是,操作系统正在为您的程序分配与平面内存模型不同的内存位置。所以,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(在Linux中就像操作系统一样) *添加的地址是80483E4&lt;&lt;这是proc的相对地址并保持不变 * addition1的地址是80483EE&lt;