请考虑以下代码段.
if (fork() == 0)
{
a = a + 5;
printf("%d, %d \n", a, &a);
}
else
{
a = a - 5;
printf ("%d, %d \n", a,& a);
}
Run Code Online (Sandbox Code Playgroud)
AFAIK,当生成fork()时,父级的虚拟地址空间被复制到子级,并且子级和父级共享相同的物理页面,直到其中一个尝试修改.当其中一个子和父修改变量时,父项的物理页面被复制到另一个子页面,而物理页面保持私有.所以,这里'a'的值在child&parent中是不同的.但是当它涉及子和父的'a'地址时,输出是相同的.即使物理页面不同,我也无法弄清楚为什么地址保持不变.
地址a不是实际的物理地址.
这是一个虚拟地址.
硬件/操作系统层将虚拟地址映射到物理地址(对您的应用程序不可见).
因此,即使地址相同,number它们也不会映射到ram芯片上的相同物理内存.
PS.使用printf()打印地址(即指针)时最好使用"%p"