*ptr = val;
動作します。ただし、このアドレスが割り当てられ、さらにアクセス可能であることを確認する必要があります。C で何をプログラミングしているのかわからなくても、アクセス許可のないアドレスへのアクセスを防止するいくつかの方法を提案できます。したがって、使用しているアーキテクチャや運用システムに大きく依存します。
たとえば、ATMEGA32 マイクロコントローラでは、そのためのメイン メモリへのアクセスに関する制限はありません。それから/のためにコードを読み、書き、実行することができます:
PORTB = 1;
// Knowing that PORTB is stored at 0x38, you can do the equivalent:
*((unsigned int *)0x0038) = 1;
しかし、それは組み込みシステム上です。メモリ空間への完全なアクセスが必要な場合 (アプリケーション サンドボックス内にある限り)、VirtualProtect
Windows とmprotect
Linuxで使用できます。
int val = 123;
DWORD oldprotection;
VirtualProtect((LPVOID)0x261, sizeof(int), PAGE_EXECUTE_READWRITE, &oldprotection);
*(int *)0x261 = val;
そして、これで使用できる保護の種類は次のとおりです:メモリ保護定数。
そしてmprotect
例:
int val = 123;
mprotect((const void *)(((int)(0x261) / PAGESIZE) * PAGESIZE), sizeof(int), PROT_WRITE | PROT_READ | PROT_EXEC);
*(int *)0x261 = val;
このmprotect
例はテストされていないことに注意してください。保護などのためにサイズを大きくする必要がある場合があります。
そこによる除算PAGESIZE
は、アドレスを正しく整列させるための単なるトリックです。また、アドレスが Linux では無効であることに注意してください。これは、 がそれより大きい場合、除算が 0 になるためです ( 「it will be」とPAGESIZE
同じ)。
ポインターを使用してアドレスにアクセスするための構文によれば、これらはすべて機能します。
*(int *)0x261 = val;
int *ptr = (int *)0x261;
*ptr = val;