1. 程式人生 > >c語言中通過指標將數值賦值到制定記憶體地址

c語言中通過指標將數值賦值到制定記憶體地址

1.一種直觀的方法

假設現在需要往記憶體0x12ff7c地址上存入一個整型數0x100。我們怎麼才能做到呢?

我們知道可以通過一個指標向其指向的記憶體地址寫入資料,那麼這裡的記憶體地址0x12ff7c其本質不就是一個指標嘛。所以我們可以用下面的方法:

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

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

1.1 為什麼在此處,我們敢往0x12ff7c這個地址賦值呢?

  至於這裡為什麼選擇記憶體地址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;”這句程式碼刪除。一切“罪證”銷燬得一乾二淨,簡直是做得天衣無縫。

2.另一個方法

除了這樣就沒有別的辦法了嗎?未必。我們甚至可以直接這麼寫程式碼:

*(int *)0x12ff7c = 0x100;

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


上面討論了這麼多,其實其表達形式並不重要,重要的是這種思維方式。也就是說我們完全有辦法給指定的某個記憶體地址寫入資料的。