我在main()
中制作了以下代码int (*Addition)(int x, int y) = FuncAdd;
cout<<endl<<"Address of Addition is: "<<Addition<<endl;
现在每次都执行它。我得到这样的价值观:
增加地址是:01161450
增加的地址是:001B1450
增加地址是:00F91450
依旧......
正如我们所看到的,每次地址都不同,尽管所有这些地方都有较低的单词(1450-H)。那背后的原因是什么?
答案 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;