如果在两个不同的终端中运行程序foo.c,则打印正在执行的局部变量的地址。他们会是一样的。但是,在分叉和执行的情况下,例如内部shell,我运行一个程序,如foo.c。它将创建一个完全相同的shell副本,然后执行foo.c。它们是否具有相同的虚拟地址空间。 如果一个程序递归调用自身,那么递归调用的同一个变量是否仍具有相同的地址空间以及该程序如何在其自己的地址空间内增长呢?
答案 0 :(得分:1)
如果在两个不同的终端中运行程序foo.c,则打印正在执行的局部变量的地址。他们会是一样的。
不一定,现代操作系统使用address space layout randomization,这意味着内存地址可以(并且确实)从一次执行转换到下一次执行。
在分叉和执行的上下文中说例如在shell中,我运行一个程序如foo.c。它将创建一个完全相同的shell副本,然后执行foo.c。它们是否具有相同的虚拟地址空间。
不,每个进程都有自己的虚拟地址空间。变量的地址可能看起来相同,但在一个进程中写入局部变量对其他进程没有影响(除非您明确共享内存)
如果一个程序递归调用自身会怎么样,递归调用的同一个变量是否仍然具有相同的地址空间以及该程序如何在其自己的地址空间内增长?
研究进程和线程之间的区别,以便更好地了解这里发生的事情。如果程序分叉,则子进程具有单独的地址空间。如果函数在程序中调用自身,它将在相同的地址空间中执行,但局部变量将在每个堆栈帧中分开。全局(或静态)变量将跨函数调用处于相同的内存地址。
答案 1 :(得分:0)
如果您在两个不同的终端中运行foo.c并打印了局部变量的地址,它们将显示相同的内容。但是,它们是两个不同的变量,碰巧具有相同的值。
它们没有指向内存中的相同区域。
从shell分叉也会使进程在虚拟内存的两个不同区域内有两个独立且不同的变量。
事实上,如果您从foo.c生成进程
,就会出现这种情况如果您希望在两个进程之间共享内存,则需要生成线程或使用shared memory。