一般的なCコンパイラを使用すると、整数からポインタを設定し、それを使用してメモリにアクセスでき、期待どおりの結果が得られます。ただし、これはC標準を超える拡張機能であるため、コンパイラのドキュメントをチェックして、それがサポートされていることを確認する必要があります。この機能は、特定のアドレスのメモリにアクセスする必要があるカーネルコードでは珍しく使用されません。通常、ユーザープログラムでは役に立ちません。
コメントで述べたように、発生している可能性のある問題の1つは、プログラムがロードされるたびに、オペレーティングシステムがプログラムをランダム化された場所にロードすることです。したがって、ある実行で検出したアドレスは、別の実行で使用されたアドレスにはなりません。また、ソースを変更して再コンパイルすると、異なるアドレスが生成される場合があります。
ポインタを使用して数値で指定されたアドレスにアクセスできることを示すために、アドレスを取得して、単一のプログラム実行内で使用できます。
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>
int main(void)
{
// Create an int.
int x = 0;
// Find its address.
char buf[100];
sprintf(buf, "%" PRIuPTR, (uintptr_t) &x);
printf("The address of x is %s.\n", buf);
// Read the address.
uintptr_t u;
sscanf(buf, "%" SCNuPTR, &u);
// Convert the integer value to an address.
int *p = (int *) u;
// Modify the int through the new pointer.
*p = 123;
// Display the int.
printf("x = %d\n", x);
return 0;
}
明らかに、これは通常のプログラムでは役に立ちません。単なるデモンストレーションです。この種の動作は、特定のアドレスにアクセスする特別な必要がある場合にのみ使用します。