我通过提供不同的输入来调试两个终端中的程序,但特别是我在一个终端中看到了这个
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)
如何将相同的内存位置分配给指针。我在两个不同的终端上运行相同的程序......输入不同
答案 0 :(得分:9)
您正在查看的内存地址是虚拟地址。然后,处理器将这些地址转换为物理地址。这是所有现代操作系统的基础。每个进程都认为它拥有整个地址空间(在32位机器的情况下为4GB,在64位机器的情况下则更多)。当进程访问尚未分配给它的内存时,CPU会生成页面错误。然后,操作系统可以通过多种方式之一处理无效的内存访问;一种常见的方式是分段错误。
答案 1 :(得分:5)
对于虚拟内存,系统上运行的每个程序都充当了计算机自身的整个地址空间。但是,每次取消引用指针时,一个特殊的硬件都会从指针的声称地址(其虚拟地址)转换到数据实际存在的内存中的某个其他位置(物理地址) )。操作系统用于管理和移动虚拟地址映射到的内存区域,因此如果一个程序取消引用某个地址 A ,它将映射到物理内存中的不同位置,而不是您在其他进程中取消引用地址 A 。实际上,任何数量的程序都可以声称使用地址 A 而不会有麻烦,因为这些虚拟地址都解析为系统上的不同物理地址。
答案 2 :(得分:1)
除了那些被称为虚拟和“私有”的每个进程之外,不要忘记一些物理内存确实可以在进程之间共享。例如,当您fork()
进程没有立即完全复制时 - 代码只是保持共享状态,数据页只在尝试修改它们时被复制(“写入时复制”),因此两个程序确实可以实现物理内存共享(对它们透明)。