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转换指定符格式化在一个实现定义的方式将指针.此外,如果在完成正确的类型转换后将其打印为整数,那么转换的结果将是实现定义的.所以,你的程序可能会随时打印0xffffffff或foobar或why are you even curious of internals like a pointer's value每次尝试打印一个指针.所以是的,这两个程序可能会有相同的输出.
C语言没有指定两个不同进程之间的交互.无法保证两个不同程序中的指针彼此之间具有任何有意义的连接.
如果指定操作系统,C编译器以及程序的执行方式,则可能会提供可以帮助您的答案.
然而,这不是C语言试图控制的东西,完全取决于操作系统和运行程序的硬件.