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

2021-09-06 14:49:39 字數 1109 閱讀 7818

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型別的資料;然後通過鑰匙「*」向這塊記憶體寫入乙個資料。

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

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

1.一種直觀的方法 假設現在需要往記憶體0x12ff7c位址上存入乙個整型數0x100。我們怎麼才能做到呢?我們知道可以通過乙個指標向其指向的記憶體位址寫入資料,那麼這裡的記憶體位址0x12ff7c其本質不就是乙個指標嘛。所以我們可以用下面的方法 1 2 int p int 0x12ff7c p 0...

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

1.一種直觀的方法 假設現在需要往記憶體0x12ff7c位址上存入乙個整型數0x100。我們怎麼才能做到呢?我們知道可以通過乙個指標向其指向的記憶體位址寫入資料,那麼這裡的記憶體位址0x12ff7c其本質不就是乙個指標嘛。所以我們可以用下面的方法 1 2 int p int 0x12ff7c p 0...

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

1.一種直觀的方法 假設現在需要往記憶體0x12ff7c位址上存入乙個整型數0x100。我們怎麼才能做到呢?1 int p int 0x12ff7c 2 p 0x100 需要注意的是將位址0x12ff7c賦值給指標變數p的時候必須強制轉換。1.1 為什麼在此處,我們敢往0x12ff7c這個位址賦值呢...