为指针分配内存

时间:2011-02-02 05:48:03

标签: c pointers

我通过提供不同的输入来调试两个终端中的程序,但特别是我在一个终端中看到了这个

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)

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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

除了那些被称为虚拟和“私有”的每个进程之外,不要忘记一些物理内存确实可以在进程之间共享。例如,当您fork()进程没有立即完全复制时 - 代码只是保持共享状态,数据页只在尝试修改它们时被复制(“写入时复制”),因此两个程序确实可以实现物理内存共享(对它们透明)。