0

在下面给出的程序中,两个进程的虚拟地址是相同的。我理解全局变量的原因,但无法理解局部变量。

运行前如何将虚拟地址分配给局部变量?

int main()
{
  int a;
  if (fork() == 0)
  { 
     a = a + 5; 
    printf(“%d,%d\n”, a, &a); 
  }
  else 
  { 
     a = a –5;
    printf(“%d, %d\n”, a, &a); 
   } 
}
4

3 回答 3

3

虚拟地址是……虚拟的。这意味着来自两个不同进程(如父进程及其子进程)的相同虚拟地址指向两个不同的物理地址。

于 2012-07-14T10:06:18.587 回答
2

编译时,编译器决定将堆栈或寄存器用于局部变量。在这种情况下,堆栈。

它还决定在(虚拟)地址空间中放置堆栈的位置。

因此,对于这两个进程,堆栈都从相同的(虚拟)地址开始。由于这个特定程序的流程是相当确定的,因此两个进程的堆栈帧看起来完全相同,从而导致“a”在堆栈中的偏移量相同。

于 2012-07-14T10:22:37.790 回答
0

无论afork之前的地址是什么,fork之后肯定是一样的,所以在两个进程中必然是一样的,因为它们的地址a都是相同的。在大多数实现中,a通过将偏移量(由编译器确定)添加到堆栈指针的内容来获得的地址。堆栈指针的内容被 fork 复制。

于 2012-07-14T10:52:39.463 回答