2010-02-16 56 views
8

我試圖調試我編寫的程序。根據調試器,特定的void *保存值0x804b008。我希望能夠取消此值(將其轉換爲int *並獲取它的值)。解引用C中的任意內存位置

我得到這段代碼的分段錯誤。 (與void *程序仍在BTW後臺運行 - 這是「已暫停」)

#include <stdio.h> 

int main() { 
    int* pVal = (int *)0x804b008; 
    printf("%d", *pVal); 
} 

我可以看到,爲什麼能夠尊重在內存中的任何一點可能是危險的,所以也許這就是爲什麼這是不工作。

謝謝!

回答

7

你的程序(在調試器中運行)和這個程序不會在同一個虛擬內存空間中運行;訪問該指針(即使它是有效的)不會給你任何信息。

機器上運行的每個程序都有自己的邏輯地址空間。您的操作系統,編程語言運行時和其他因素可能會影響您看到的用於指定程序指針的實際文字值。但是一個程序絕對是不能看到另一個程序的內存空間,當然除了軟件調試程序,它會做一些特殊的技巧來支持這種行爲。

在任何情況下,您的調試器都應該讓您在程序暫停時看到您想要的任何內存 - 假設您有一個有效的地址。在gdb x/x 0x804b008會給你你想看到的。

欲瞭解更多信息:

  1. Virtual Memory維基百科的文章。
  2. gdb documentation
+0

我讀過一些關於操作系統開發的內容,所以我相信我理解你在說什麼。 這個虛擬內存位於RAM中 - 剛剛映射到不同的尋址方案或其他東西? 再次感謝。 編輯:我甚至問過之前回答了我的問題! – Tyler 2010-02-16 05:21:58

+0

虛擬內存就意味着,就編寫程序時所擔心的問題而言,您擁有一個很好的連續內存空間。操作系統爲您處理所有潛在的內存碎片。 – 2010-02-16 05:24:01

+0

謝謝。我收集了很多。我更感興趣的是*它如何在操作系統級別上實現。 http://en.wikipedia.org/wiki/Virtual_memory#Page_tables似乎是如何完成的。 謝謝 – Tyler 2010-02-16 05:26:01

0

這是相當簡單的。操作系統知道該地址不屬於您的程序,所以如果不繞過內存保護,則無法打印。