2013-03-18 78 views
1

我知道可以用&運算符找到變量或函數的內存地址。但是如果我知道某些內存位置2,我該如何訪問它?如何訪問已知內存地址的內容?

舉例來說,如果我宣佈一個指向2,它會被解讀爲價值2,而不是內存地址2

+1

'int * x =(int *)2;'? – Pubby 2013-03-18 16:47:18

+0

關於編輯:您可以通過點擊問題下方的「編輯X之前」鏈接來訪問修訂歷史記錄。如果你覺得合適,你可以回滾到另一個版本。但是,請注意,對你的問題進行預處理並且對其假定的愚蠢性發表評論並不是很有用。 – Quentin 2016-12-26 15:03:01

+0

@Quentin。評論是關於在未經我的同意的情況下改變我的問題的愚蠢,也沒有必要這樣做。 – stian 2016-12-26 21:22:02

回答

5

你只需要施展它是一個指針:

int *pointerToTwo = (int *)2; 

然後,你可以解引用照常:

int valueAtTwo = *pointerAtTwo; 

通常的原因,你會做這種事情是訪問存儲器映射的寄存器,其中,使用所述volatile關鍵字的情況下,建議:

int valueAtTwo = *(volatile int *)2; 

或者,也許堅持所有鑄造成宏來使你的代碼更易於閱讀:

#define intValueAt(x) (*(volatile int)(x)) 
int valueAtTwo = intValueAt(2); 

旁白:2是幾乎可以肯定不是這個用例的有效地址。我剛剛使用它是因爲你在你的問題中引用了它。

+2

請注意,這樣做需要額外的指針/內存地址格式的知識。在某些情況下,從0開始並且從那裏繼續存儲的內存不是一個簡單的例子。此外,您可以嘗試訪問受保護的讀寫訪問權限的內存。您可以嘗試寫入ROM。你可以弄髒內存映射的IO設備。這就是說,它可以是非常有用的,當負責任地使用。 – 2013-03-18 16:51:25

1
void* pMemory = (void*)2L; 

這將創建一個void*(空指針),並將其地址設置爲2

請注意,如果您的進程不應該訪問該內存(您無權讀取該內存),則可能會導致各種錯誤。另外請注意,你不應該隨機讀取地址。使用指針直接訪問內存位置很容易出錯。這就是爲什麼軟件開發人員開發出如此多的技術來幫助我們在正確的環境下僅使用正確的預期數據類型訪問正確的內存地址。

1

您可以只投它爲int *獲取一個指針,就像這樣:

int *ptr = (int *)2; 

然後你就可以通過正常的*運算符訪問2的內容。

int i = *ptr; 

會做你想做的。

但是,值得注意的是,在實踐中,上面的'i'不是RAM的第二個單元格的實際內容。這是因爲在用戶模式的應用程序中,'2'總是被視爲虛擬地址,並被轉換(在運行時)爲物理地址。在類Unix操作系統中,用戶模式代碼通常沒有辦法做這樣的事情。