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

Sau*_*ana 26 c pointers

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

rjv*_*rjv 51

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

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

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


Bas*_*tch 27

在Linux等操作系统上,正在运行的程序称为进程.每个进程都有自己的地址空间并使用虚拟内存.因此,相同的地址0x12345通常指的是过程A和过程B中的不同存储单元.

阅读高级Linux编程,其中有一些章节解释了这一点(从Linux的角度来看).另请参见fork系统调用,并阅读fork(2),mmap(2),execve(2)手册页.

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

细节可能非常复杂(实际上,某些RAM 可以在进程之间共享......).阅读有关写入,共享内存等的副本 ...

另请阅读一些关于操作系统好书,例如Tanenbaum的书,或操作系统:Three Easy Pieces(可在线免费下载).


小智 11

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

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

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

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


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

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

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

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


Ada*_*vis 6

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

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

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

  • +1提及C没有指明任何关于此的内容. (2认同)