%u
形式はsizeof(void *) == sizeof(unsigned)
、通常 32 ビット コードには当てはまりますが、64 ビット コードには当てはまりません。フォーマットを制御したい場合 ( の外観を制御することはできません)、 C99%p
から使用することをお勧めします。<inttypes.h>
printf("0x%.8" PRIXPTR "\n", (uintptr_t)&object);
マクロ PRIXPTR は、型の値uintptr_t
と変換指定子の正しい長さ修飾子を提供しますX
。型uintptr_t
は、任意のポインターを保持するのに十分な大きさの整数型です。これ.8
により、少なくとも 8 桁の 16 進数が出力されることが保証されますが、アドレスが 64 ビット量であり、値の先頭 (最上位) 32 ビットにビットが設定されている場合はさらに多くなります。
厳密には、 を使用する場合は、(a)キャストによって%p
スタック上の値が実際に a であることを確認する必要があります( et al は可変個引数関数であり、変換が自動的に行われないため)、および (b) があるフォーマットのクロスプラットフォーム標準はありません。多くの場合、接頭辞のない小文字の 16 進数と同等です。一部のシステムはプレフィックスを生成します。実際には、通常は安全に.void *
fprintf()
0x
0x
int *
理論的には、標準 C では、関数ポインターを出力する方法はありません。関数ポインターがデータ ポインターと同じサイズであるという保証はありません。幸いなことに、POSIX が介入し、POSIX システムでは、関数ポインターはデータ ポインターと同じサイズにする必要があると述べています。したがって、少なくとも Unix システムでは、事実上 Windows システムでは、データ ポインターと関数ポインターを安全に出力できます。