2011-02-02 68 views
5

我是通过给不同的输入中的两个端子调试程序,但在上特定我看到这在一个终端分配的存储器,用于指针

ins (ptr=0x0, key=1, upKey=0xbffff308, newnode=0xbffff30c) 

而在另一个终端

ins (ptr=0x0, key=1, upKey=0xbffff308, newnode=0xbffff30c) 

其中ins功能是

ins(struct node *ptr, int key, int *upKey,struct node **newnode) 

如何将同一个内存位置分配给一个指针。并且我在两个不同的终端上运行相同的程序...使用不同的输入

+2

这是一个很好的问题。 – sharptooth 2011-02-02 06:00:50

回答

5

使用虚拟内存时,系统上运行的每个程序的行为就好像它具有计算机的整个地址空间。但是,每当指针被解引用时,一个特殊硬件将从指针的声称地址(它的虚拟地址)转换到数据实际存在的内存中的某个位置(物理地址)。操作系统用于管理和移动虚拟地址映射到的内存区域,因此如果一个程序对某个地址解引用某个地址A它将映射到物理内存中的一个不同位置,而不是您在取消引用地址时得到的位置A在不同的过程。实际上,任何数量的程序都可以声称使用地址A而没有麻烦,因为这些虚拟地址全部解析为系统上的不同物理地址。

+1

请注意,如果不是这种情况,`fork`函数将不可能。 – 2011-02-02 06:53:06

9

您正在查看的内存地址是虚拟地址。这些地址然后由处理器转换为物理地址。这是所有现代操作系统的基础。每个进程都认为它拥有整个地址空间(32位机器的情况下为4GB,64位机器的情况下则更多)。当进程访问尚未分配给它的内存时,CPU会产生页面错误。然后操作系统可以通过几种方式之一处理无效的内存访问;一种常见的方式是分段故障。

1

除了那些针对每个进程虚拟和“私有”的地址,不要忘记一些物理内存的确可以在进程间共享。例如,当您的进程没有立即完全复制时 - 代码只是保持共享,并且数据页仅在试图修改它们时才被复制(“写入时复制”),因此两个程序确实可以共享物理内存(透明地给他们)。