2009-08-24 87 views

回答

11

你問一般指針嗎?

在大多數操作系統上,它們都是邏輯地址。

操作系統負責通過虛擬內存和分頁機制將它們轉換爲物理地址。這對程序是透明的。這就是爲什麼一個誤導性的節目「碰到邊界」和GPF。

在一些舊系統(例如DOS)上,它們將是物理的,允許您覆蓋內存其他部分的內容。

7

取決於操作系統和代碼運行的級別。

對於現代操作系統上的普通用戶程序,您將獲得虛擬地址。

+1

但如果我運行以下程序:int main(){int(* p)(); p = main; printf(「%p」,p);} 它給的地址如0x80483c4,它認爲它是物理地址,爲什麼主要的虛擬地址會在這麼大的地址啓動? 我在linux.plz上運行這個澄清如果我錯了?? – mawia 2009-08-24 18:35:21

+4

你錯了。這是一個虛擬地址。沒有人說你的main()函數是在虛擬地址0加載的。實際上,在ELF二進制文件(在linux中使用)中默認情況下,代碼段從虛擬地址0x80482c0開始,這看起來是正確的(有一些隱藏的設置main()之前的代碼)。請記住,虛擬地址空間通常是非連續的,虛擬地址只在您使用時分配。僅僅因爲你的程序在0x80482c0加載並不意味着在那裏和0x0之間的所有內容都已經被分配了。 – 2009-08-24 18:41:41

+0

如果你真的有興趣瞭解你的程序在Linux下如何在內存中組織,請閱讀以下內容:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html – 2009-08-24 18:42:17