1

発生しているコンパイルエラーについてサポートが必要です。

エラーは次のとおりです。エラー:異なるサイズの整数からポインターにキャスト[-Werror =int-to-pointer-cast]

次の行に

PRINT_INDENT("Inode2 PTR: %p\n", (void *)ptr);

コンテクスト

unsigned int ptr;
memcpy(&ptr, value, sizeof(ptr));
PRINT_INDENT("Inode2 PTR: %p\n", (void *)ptr);

#define PRINT_INDENT(...) ({int __j = indent_level; while (__j-- > 0) printf("  "); printf(__VA_ARGS__);})
4

3 に答える 3

2

32ビットの64ビットプラットフォームを使用していますintか?もしそうなら、エラーは自明です。ptrは32ビット変数であり、64ビットにキャストしていますvoid *。回避策は、最初にそれをにunsigned long longキャストし、次に結果をにキャストすることvoid *です。

PRINT_INDENT("Inode2 PTR: %p\n", (void *)(unsigned long long)ptr);

しかし、なぜあなたはこれをしているのですか?次のようにキャストするのではなく、単に印刷ptrしてみませんか。unsigned intvoid *

PRINT_INDENT("Inode2 PTR: %u\n", ptr);
于 2012-10-25T03:48:00.030 に答える
1

なぜintをポインタにキャストする必要があるのか​​わかりません。ポインタを印刷するだけの場合は、必要ない場合があります。

ただし、そのようなキャストが必要な場合は、整数が適切なサイズであることを確認するために、C ++ 11は、ポインターを保持するのに十分な大きさの符号なし整数データ型のエイリアスを提供します。

std::uintptr_t

これはcstdintヘッダーで定義されています(Cの場合、C99標準ではこれも同様uintptr_tに定義されstdint.hています)。

これを整数型として使用する(または既存の整数型をこれにキャストする-ただし、元の型が大きい場合は情報が失われる可能性があることに注意してください!)int/pointerキャストが本当に必要な場合は正しいアプローチです。

関連する質問を参照してください:uintptr_tデータ型とは何ですか

于 2012-10-25T03:51:46.447 に答える
0

uintptr_tこのタイプのことをしたい場合は、タイプを使用する必要があります。これは、C99およびC++11標準で利用可能な比較的新しいタイプです。

intがポインタ値を保持するのに十分な大きさであるという保証はありません。実際、32ビットintと64ビットポインタを備えた64ビットプラットフォームでは、そうではありません。

memcpy(&ptr, value, sizeof(ptr));

がポインタの場合value、この行は64ビット値の半分のみをコピーします。

于 2012-10-25T03:47:45.853 に答える