2011-02-02 34 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

除了那些針對每個進程虛擬和「私有」的地址,不要忘記一些物理內存的確可以在進程間共享。例如,當您的進程沒有立即完全複製時 - 代碼只是保持共享,並且數據頁僅在試圖修改它們時才被複制(「寫入時複製」),因此兩個程序確實可以共享物理內存(透明地給他們)。