C++からのアドレスに格納されvoidポインター?
質問
どうすればメモリアドレスのポインタをポイント?私の場合はvoidポインタです。で提供するゾーンに分かくこのエラー:
Error 1 error C2440: 'return' : cannot convert from 'void *' to 'UInt32'
よろしく!
解決
std::size_t address = reinterpret_cast<std::size_t>(voidptr);
// sizeof(size_t) must be greater or equal to sizeof(void*)
// for the above line to work correctly.
@Paul謝
だと思っているのに十分な換 void*
へ size_t
この特定の問題のための三つの理由
の質問かを指定した場合には いポータブル液です。た とうまくいったことであった。わからないなどの それが かた 作IA-32Windowsまたはその他の システムの下で保護モードになります。その 手段の変換のポインタを 整数が定義された操作 このシステムであっても定義されていない標準C++.
第二に、私の提案の最初の変換のポインタ
int
が明らかに意味がないとして litb や jalf を示した。私の修正に間違っと交換int
とsize_t
.最後に、私にくる何かを見つけなければならない関係に何を提案したソリューションとしての基準。残念ながら見られませんでしたが何も関係します。私はこの参照: ANSI ISO IEC14882 2003年.と思いsellibitzeことを指摘で ま するのです。全然わかんないつつ、明らかにC99導入したこの溶液とする。思いを見せてくれるポータブル液可能です。
いお気軽に正しく何度も失敗を繰り返しなが、私は在学でユニ:)
おかげさ
他のヒント
Aポインタ、CおよびC ++でのはのいくつかの抽象的形式のメモリアドレスの実施形態を示します。あなたのように、ポインタの実装の特定の文字列の解釈を得ることができます:
printf ("%p", voidPointer);
もう一つの方法は、intptr_tにキャストすることです。
(intptr_t) voidPointer;
C ++でNULLポインタがので、おそらく上記の操作で(intptr_t)0のequiavlentになるだろう、「0」に等しいと定義されます。しかし、それはあなたが解釈する必要がありますし、どのような実装固有の知識までまだそのメモリアドレスとしてます。
点は、それらのメモリモデルとしてオフセットを有するセグメントを有する16ビットx86 DOSコンパイラなど奇妙なメモリ・モデルを使用するプラットフォームで、ポインタは多くの方法で解釈することができることです。 0またはSS:0ではなく、単なる0
生のアドレス表現NULLでDSかもしれませんあなたはキャストを必要とする - のいずれかreinterpret_cast
(望ましい):
UInt32 address = reinterpret_cast<UInt32>( voidPointer );
またはCスタイルのキャスト(実際にはお勧めしません):
UInt32 address = (UInt32)voidPointer;
あなたはsprintfの持つアドレスの文字列表現を取得することができます()または%Pの書式指定子を使用して)(のprintfでそれを表示し、例えばます:
printf( "%p", voidptr ) ;
すでに示唆したように、あなただけのアドレスが上のポインタ演算を実行したい場合は、適切な具体的なデータ型のポインタにキャストが、それ以外の整数にキャストします。
でC ++私はと尖ったアドレスを印刷することができました
cout << "Address: " << ((unsigned)my_ptr);