2012-09-06 4 views
5

特定のメモリアドレスの値を取得:C++ - 私はこのような何かすることが可能であるかどうかを疑問に思った

unsigned int address = 0x0001FBDC; // Random address :P 
int value = *address; // Dereference of address 

意味を、それは、メモリ内の特定のアドレスの値を取得することは可能でしょうか?

おかげ

+3

あなたはまだそれを試していないことがありますか? –

+2

あなたがそれを得ることができたら、あなたは何をしたいですか?ヒント:しないでください。 –

+0

@Als - 避けられないこともあります。埋め込み型またはドライバ型。 –

答えて

14

あなたはこのようにそれを書くべきことができます。整数にpポイントは、これは未定義の動作であることを、いくつかの保証がない限りという

#include <cstdint> 

uintptr_t p = 0x0001FBDC; 
int value = *reinterpret_cast<int *>(p); 

注意。あなたがアドレスしたくないアドレスにアクセスしようとすると、標準のオペレーティングシステムがプロセスを停止させます。しかし、これは自立型プログラムの共通パターンである可能性があります。

(C++の以前のバージョンでは、#include <stdint.h>intptr_tを言う必要があります。)

+0

この場合、OPが使用するCスタイルのキャストと 'reinterpret_cast'の間に違いはありますか?私は後者がこの場合に前者にちょうど崩壊すると思いますか? –

+0

+1型の不一致を修正するのに、もちろん、それはうまくいくでしょう(あなたの注意書きのアドレス可能性、メモリ管理の保護などで)、そうでなければポインタは使えなくなります! –

+0

@Als:むしろ、Cスタイルのキャストは 'reinterpret_cast'に崩壊します。 C++でのCスタイルのキャストの意味は、C++スタイルのキャストIIRCの観点から定義されています。コンパイラに関する限り、C++でのCスタイルのキャストは、通常、ちょうど「私がここにキャストしたいものがわからないので、シェフの選択肢を取る」と言っているだけです。あなたがCスタイルのキャストではできるが、C++スタイルのキャストではできないと思われるものがあると思うので、私は普通に言う。バウンダから派生したものをポインタからプライベートベースにキャストすること。 –