两个程序中指针的地址可以相等吗?

时间:2013-12-21 07:11:20

标签: c pointers

当两个程序同时运行,并且您打印指针指向的地址时,是否会发生两个程序打印相同的值?

6 个答案:

答案 0 :(得分:51)

是。该程序在OS分配的虚拟内存中运行。虚拟内存量由处理器体系结构决定。

您看到的地址是指虚拟内存地址,而不是物理RAM地址。

我想补充说,在系统上运行的每个进程都会获得一个巨大的地址空间(32位操作系统上为2 ^ 32,64位上为2 ^ 64)位OS)分配给它。这个进程在这个虚拟地址空间运行。

答案 1 :(得分:27)

在Linux等操作系统上,正在运行的程序称为process。每个流程都有自己的address space并使用virtual memory。因此,相同的地址0x12345通常是指进程A和进程B中的不同内存单元。

阅读Advanced Linux Programming,其中有一些章节解释了这一点(从Linux的角度来看)。另请参阅fork system call,并阅读fork(2)mmap(2)execve(2)手册页。

其他操作系统(Windows,MacOSX)也使用虚拟内存在各自的地址空间中运行进程。

详细信息可能非常复杂(实际上,某些RAM 可以在进程之间共享)。阅读copy on writeshared memory等...

另请阅读一些关于Operating Systems的好书,例如Tanenbaum's本书,或Operating Systems : Three Easy Pieces(可在线免费下载)。

答案 2 :(得分:11)

你的问题标题与身体不太匹配。标题问:

  

两个程序中的指针地址是否相等?

是的,这是可能的,因为其他人已经指出存在虚拟内存和各种其他诡计。

此外,NULL指针常量在程序的每个实例中通常总是相同的(老实说,我不知道一个平台,它会随着运行的不同而变化)。因此,如果在两个程序中都打印NULL,则甚至可以预期结果将是相同的。


现在问题是,你在询问打印这些指针,这是完全不同的事情:

  

当两个程序同时运行,并且您打印指针指向的地址时,是否会发生两个程序打印相同的值?

由于这是用c标记的,我将从C的角度回答:

是的。假设您的意思是printf("%p", (void *)thePointer),这是完全可能的。 %p转换说明符以实现定义的方式格式化指针。此外,如果在完成正确的类型转换后将其打印为整数,那么转换的结果将是实现定义的。因此,每次尝试打印指针时,您的程序可能始终打印0xfffffffffoobarwhy are you even curious of internals like a pointer's value。所以是的,两个程序可能会有相同的输出。

答案 3 :(得分:6)

C语言没有指定两个不同进程之间的交互。无法保证两个不同程序中的指针之间会有任何有意义的连接。

如果指定操作系统,C编译器以及程序的执行方式,可能会提供可以帮助您的答案。

然而,这不是C语言试图控制的东西,完全取决于操作系统和运行程序的硬件。

答案 4 :(得分:3)

是的,它可能发生。该程序在虚拟内存上运行。如果进程开始执行,则为每个进程创建process address space。打印时,不仅2个进程,多个进程可以具有相同的地址。

https://stackoverflow.com/a/18479996/1814023将为您提供进程地址空间的外观......并且每个进程都有一个由操作系统分配的类似副本。

答案 5 :(得分:0)

如果您想这样做,可以在两个进程之间使用share memory