2

ポインタが指す値のメモリアドレスを取得するにはどうすればよいですか?私の場合、それはvoidポインタです。uintに割り当てるだけで、次のエラーが発生します。

Error   1   error C2440: 'return' : cannot convert from 'void *' to 'UInt32'

ありがとう!

4

5 に答える 5

14
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 Hsieh 3つの理由から、この特定の質問に変換する
だけで十分だと思います。void*size_t

  • 質問者は、ポータブルソリューションが必要かどうかを指定しませんでした。彼はそれが彼と一緒に働いたと言った。それが何を意味するのか正確にはわかりませんが、彼がWindowsまたはプロテクトモードの他のシステムでIA-32に取り組んでいることは明らかです。つまり、ポインタを整数に変換することは、標準のC ++で定義されていない場合でも、そのシステムで定義されている操作です。

  • 次に、 litbjalfintが示したように、明らかに無意味なポインタを最初に変換することを提案しました。行った間違いを修正し、に置き換えました。intsize_t

  • 最後に、私はあなたが標準の解決策として提案したものに関連する何かを見つけるために一生懸命努力しました。残念ながら、関連するものは見つかりませんでした。私はこの参照を持っています:ANSI ISO IEC148822003。セリビッツェは、これが今後の基準の一部になると指摘したと思います。私は本当にCについて知りません、そして明らかにC99はこの完璧な解決策を導入しました。誰かにC++のポータブルソリューションを見せてもらいたいのですが。

どうぞ、私の間違いを訂正することを躊躇しないでください、私はまだ大学の学生です:)

ありがとう、

于 2009-10-20T10:03:26.447 に答える
11

CおよびC++のポインタは何らかの抽象的な形式のメモリアドレスの具体化です。ポインタの実装固有の文字列解釈は、次のように取得できます。

printf ("%p", voidPointer);

別の方法は、それをintptr_tにキャストすることです。

(intptr_t) voidPointer;

C ++のNULLポインターは「0」に等しいと定義されているため、おそらく上記の操作で(intptr_t)0と同等の値が得られます。ただし、それはまだあなたと、それをメモリアドレスとして解釈しなければならない実装固有の知識次第です。

重要なのは、16ビットx86 DOSコンパイラなどの奇妙なメモリモデルを使用するプラットフォームでは、メモリモデルとしてオフセットを持つセグメントがあり、ポインタはさまざまな方法で解釈できるということです。生のアドレス表現では、NULLは単なる0ではなくDS:0またはSS:0である可能性があります。

于 2009-10-20T10:17:04.660 に答える
1

キャストが必要です- reinterpret_cast(望ましい):

UInt32 address = reinterpret_cast<UInt32>( voidPointer );

またはCスタイルのキャスト(実際には推奨されません):

UInt32 address = (UInt32)voidPointer;
于 2009-10-20T10:07:19.903 に答える
1

sprintf()を使用してアドレスの文字列表現を取得するか、%p形式指定子を使用してprintf()を使用して表示できます。例:

printf( "%p", voidptr ) ;

アドレスでポインタ演算を実行するだけの場合は、適切な具象データ型ポインタにキャストします。それ以外の場合は、すでに提案されているように整数にキャストします。

于 2009-10-20T10:20:25.917 に答える
0

C ++では、ポイントされたアドレスを次のように出力できました。

cout << "Address: " << ((unsigned)my_ptr);
于 2012-09-24T12:17:40.970 に答える