2016-05-14 7 views
-3

Cでは、uintptr_tを入力するポインタをキャストすると、アドレスの一部が切り捨てられます。とにかくアドレス全体を整数または8バイト以下の他のデータ型として格納する方法はありますか?uintptr_tが小さすぎてアドレスを格納できません

+0

セグメント化されたメモリを持つアーキテクチャ内のポインタよりも小さいかもしれません...あなたのケースですか? –

+6

"uintptr_t型へのポインタをキャストすると、アドレスの一部が切り捨てられます"。あなたは何が起きているのか、結果を誤解していないと確信していますか?問題を示す[mcve]を入力してください。 – kaylum

+0

'uintptr_t'はC標準に従ってアドレス全体を格納しなければなりません。おそらくどこかのコードにバグがあります –

答えて

2

uintpt_tは通常、のいずれかを保持するのに十分な大きさである必要があります。ポインター。

次のタイプは、任意の有効なプロパティを有する符号なし整数型を指定:タイプが存在する場合、void *したがって、任意のオブジェクトへのポインタ(C11ドラフトn1570 7.20.1.4)を保持するのに十分な大きさでなければなりません をvoidへのポインタがこの型に変換することができ、次いで 空隙、 に戻すポインタに変換され、結果は、元のポインタに等しく比較する:

uintptr_t

【このタイプはオプションです]

は、注目すべきは、これはPOSIXのケースだろうけれども関数へのポインタ、ポータブルに再びuintptr_tに変換することができ保証はありません。


さらにC標準は、任意整数型はすべてその時があること保証は、実装上のポインタを含むのに十分な大きされません。しかし、タイプuintptr_tが存在する場合、これは当てはまりません(uintptr_tタイプは十分に大きいタイプです)。

関連する問題