簡體   English   中英

"手動訪問內存地址"

[英]Access memory address manually

有沒有辦法在不使用指針或引用的情況下手動訪問內存地址? 假設我知道整數存儲在地址0x28fed8並且我想打印該數據。 我試過std::cout << (int*)0x28fed8但它只輸出0x28fed8 當我將地址分配給像int* w1= (int*)0x28fed8;這樣的指針時,它也可以工作。 對於整數,但對於雙變量(2.22064e-313)給出奇怪的結果

#include <iostream>

int main(){
   int a=10;
   int* w1= (int*)0x28fed8;

   double b=100.578;
   double* w2= (double*)0x28fed0;

   std::cout << &a << std::endl;  // output 0x28fed8
   std::cout << *w1 << std::endl; // output 10

   std::cout << (int*)0x28fed8 << std::endl; // output 0x28fed8

   std::cout << &b << std::endl;  // output 0x28fed0
   std::cout << *w2 << std::endl; // output 2.22064e-313

   return 0;
}

當然,當我測試它時結果是准確的 - 當有人嘗試編譯該代碼時它可能會給出不同的輸出

如果要在特定地址處打印整數值,則需要執行此操作

std::cout << *(int *)0x28fed8 << std::endl;

所以你取消引用指針而不是打印指針值本身。

至於你的雙重值是錯誤的,我懷疑這與編譯器優化有關。 b變量寫入值之前,您的w2指針被取消引用。 如果這是真的,你只是碰巧得到幸運與aw1

如果你移動你的ba可變出一個全局變量或將其標記為靜態? 這應該確保該值是由指針解除引用的時間設置的,因為它可能在編譯時被硬編碼。

否則,嘗試使指針易變 - 即volatile double *w2volatile int *w1因此編譯器不會嘗試優化。

(我應該總的來說,你的代碼看起來很狡猾。但是,我不確定它是否會調用未定義的行為 - 也許其他一些用戶可以對此有所了解)

對於更清晰的方法,您需要考慮使用 reinterpret_cast<> 和某種形式的封裝。

使用 reinterpret_cast<> 您可以這樣訪問您的地址:

#define LOCATION 0x28fed8
*reinterpret_cast<DWORD64*>(LOCATION) = 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM