如何將數值存儲到指定的內存地址


 

  假設現在需要往內存地址0x12ff7c上存入一個整型數0x100,那么怎樣才能做到呢?

  我們知道可以通過一個指針向其指向的內存地址寫入數據,那么這里的內存地址0x12ff7c其本質不就是一個指針嘛,所以我們可以用下面的方法:

int *p = (int *)0x12ff7c;
*p = 0x100;

  需要注意的是,將地址0x12ff7c賦值給指針變量p的時候必須強制轉換。

  這里只選擇內存地址0x12ff7c而不選擇別的地址,比如0xff00等,僅僅是為了方便在Visual C++ 6.0上測試而已。如果選擇0xff00,那么在執行“*p=0x100;”這條語句的時候,編譯器可能會報告一個內存訪問的錯誤,因為地址0xff00處的內存可能你並沒有權力去訪問。出現一個問題,我們怎么知道一個內存地址是否可以合法地被訪問呢?也就是說怎樣知道0x12ff7c處的內存是可以別訪問的呢?其實這很簡單,我們可以先定義一個變量i,比如: int i = 0 變量i所處的內存肯定是可以被訪問的;然后在調試器的Watch窗口上觀察&i的值就知道其內存地址了。這里我得到的地址是0x12ff7c,僅此而已(不同的編譯器可能每次給變量i分配的內存地址不一樣,但Visual C++ 6.0 剛好每次都一樣)。你完全可以給任意一個可以被合法訪問的其他地址賦值,得到這個地址后再把 int i = 0; 這句代碼刪除,一切“罪證”被銷毀得一干二凈。

  

  除了這樣就沒有別的方法了嗎?未必。我們甚至可以直接這么寫代碼:

*(int *)0x12ff7c = 0x100;

  這行代碼其實和上面的兩行代碼沒有本質的區別。先將地址0x12ff7c強制轉換,告訴編譯器這個地址上將存儲一個 int 類型的數據;然后通過鑰匙“*”向這塊內存寫入一個數據。

  

  上面討論了這么多,目的就是告訴大家,其實其表達形式並不重要,重要的是這種思維方式,也就是說我們完全由辦法給指定的某個內存地址寫入數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM