当两个程序同时运行,并且您打印指针指向的地址时,是否会发生两个程序打印相同的值?
答案 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 write,shared memory等...
另请阅读一些关于Operating Systems的好书,例如Tanenbaum's本书,或Operating Systems : Three Easy Pieces(可在线免费下载)。
答案 2 :(得分:11)
你的问题标题与身体不太匹配。标题问:
两个程序中的指针地址是否相等?
是的,这是可能的,因为其他人已经指出存在虚拟内存和各种其他诡计。
此外,NULL
指针常量在程序的每个实例中通常总是相同的(老实说,我不知道一个平台,它会随着运行的不同而变化)。因此,如果在两个程序中都打印NULL
,则甚至可以预期结果将是相同的。
现在问题是,你在询问打印这些指针,这是完全不同的事情:
当两个程序同时运行,并且您打印指针指向的地址时,是否会发生两个程序打印相同的值?
由于这是用c
标记的,我将从C的角度回答:
是的。假设您的意思是printf("%p", (void *)thePointer)
,这是完全可能的。 %p
转换说明符以实现定义的方式格式化指针。此外,如果在完成正确的类型转换后将其打印为整数,那么转换的结果将是实现定义的。因此,每次尝试打印指针时,您的程序可能始终打印0xffffffff
或foobar
或why 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。