1

如果您在两个不同的终端中运行程序 foo.c,并打印正在执行的局部变量的地址。他们会是一样的。但是,在分叉和执行的上下文中,例如在 shell 中,我运行了一个程序,例如 foo.c 。它将创建一个完全相同的 shell 副本,然后执行 foo.c 。它们是否具有相同的虚拟地址空间。如果一个程序递归调用自己,递归调用的同一个变量是否仍然具有相同的地址空间,这个程序如何在自己的地址空间内增长?

4

2 回答 2

1

如果您在两个不同的终端中运行程序 foo.c,并打印正在执行的局部变量的地址。他们会是一样的。

不一定,现代操作系统使用地址空间布局随机化,这意味着内存地址可以(并且确实)从一次执行更改为下一次执行。

在分叉和执行的上下文中,例如在 shell 中,我运行一个程序,例如 foo.c 。它将创建一个完全相同的 shell 副本,然后执行 foo.c 。它们是否具有相同的虚拟地址空间。

不,每个进程都有自己的虚拟地址空间。变量的地址可能看起来相同,但在一个进程中写入局部变量对另一个进程没有影响(除非您明确共享内存)

如果一个程序递归调用自己,递归调用的同一个变量是否仍然具有相同的地址空间,这个程序如何在自己的地址空间内增长?

研究进程和线程之间的区别,以更好地了解这里发生了什么。如果一个程序 fork,子进程有一个单独的地址空间。如果一个函数在程序中调用自己,它将在相同的地址空间中执行,但局部变量将在每个堆栈帧中分开。全局(或静态)变量将在函数调用中位于相同的内存地址。

于 2013-02-24T18:52:14.020 回答
0

如果您在两个不同的终端中运行 foo.c 并打印局部变量的地址,它们将显示相同。但是,它们是两个不同的变量,恰好具有相同的值。

它们不指向内存中的同一区域。

从 shell 分叉还会使进程在虚拟内存的两个不同区域内拥有两个独立且不同的变量。

实际上,如果您从 foo.c 生成一个进程,就会出现这种情况

如果您希望在两个进程之间共享内存,则需要生成线程或使用共享内存

于 2013-02-24T18:33:55.427 回答