どの適切な利用に関すprintf表示のポインタに詰められ0s
質問
C利用したいprintf表示のポインタは、その行きたいと思いパッドとして0から
私の推測の正しないということ:
printf("%016p", ptr);
この作品は、このgccの文句は以下のメッセージ:
warning: '0' flag used with ‘%p’ gnu_printf format
私ンターネットで調べるビットで、以下のスレッドが同じトピックがないのだ。
http://gcc.gnu.org/ml/gcc-bugs/2003-05/msg00484.html
読むことで、この理由はgcc文句は文法Iが定義されていない、C99.がないのですが探しはどうしたら同じことを標準的に承認されます。
こちらではのダブルの質問:
- 私の理解で宜しいでし、この動作は定義されていないC99か。
- その場合、ある基準を承認し、携帯用いということが?
解決
#include <inttypes.h>
#include <stdint.h>
printf("%016" PRIxPTR "\n", (uintptr_t)ptr);
が、それは、実装定義された方法(8086セグメント化されたモードのためDEAD:BEEF
を言う)にポインタを印刷されません。
他のヒント
使用します。
#include <inttypes.h>
printf("0x%016" PRIXPTR "\n", (uintptr_t) pointer);
か、そのヘッダからマクロの他の変形を使用します。
またprintf()
のいくつかの実装は、ポインタの前に「0x
」を印刷することに注意してください。他のものはそうではない(どちらもC規格に従って正しい)。
のみ 携帯 に印刷ポインタ値を使用し "%p"
指定子は、実装で定義されています出力に出力します。(変換します uintptr_t
を使用 PRIxPTR
が、(a) uintptr_t
導入されたC99ので、一部のコンパイラをサポートしない場合、(b)で保証するものではありません存在してもC99がない場合が整数型ビッグを保持するのに十分な全てのポインタ値です。
使いよう "%p"
と sprintf()
( snprintf()
, ごめくりと操作上の違いがござい印刷文字列、文字列のパディングとブランクスにします。
一つの問題はありません本当に良い方法を決定する最大文字列の長さよ "%p"
.
これは確かに不便なものへと変更させて頂きますでとれた機能)。必要がなければ100%のポータビリティ、私は利用したことのないシステムのた鋳造のポインタ unsigned long
印刷の結果を用い "0x%16lx"
います。[更新:そうですね。64-bit Windowsは64ビットポイントと32ビット unsigned long
.] (または利用できる "0x%*lx"
計算の幅、そのようなもの sizeof (void*) * 2
.だが本当に被害妄想できるアシステム CHAR_BIT > 8
, れている、以上の2つの六角レンチ桁/バイトになります。)
この答えは、指定されたものの前 https://stackoverflow.com/a/1255185/1905491 その幅を考慮して明記し https://stackoverflow.com/a/6904396/1905491 るかを認識しないまでの私の回答は以下のと).以下のsnippedのまま印刷ポインタとして8 0-渡された六角文字code*機械てで表すことができる32ビット、16 64b4月16b。
#include <inttypes.h>
#define PRIxPTR_WIDTH ((int)(sizeof(uintptr_t)*2))
printf("0x%0*" PRIxPTR, PRIxPTR_WIDTH, (uintptr_t)pointer);
※ご利用の印字をフェッチの幅は次の引数は、C99(おそらく前に?), ものはなかなか見られない"、"野生.この方以上の p
変換が、後者には、実装で定義されています。
※標準で uintptr_t
するより大きい最小限のものものがあるのだろうと思っていない実装を使用しない最小限に抑えます。
それはあなたがlong型へのポインタをキャストした場合に解決するのは簡単です。問題は、それがポインタが長い内に収まる、とポインタが16文字(64ビット)で表示することができることができ前提としていて、これはすべてのプラットフォームで動作しませんです。これは、ほとんどのプラットフォーム上しかし本当です。
それはなるので:
printf("%016lx", (unsigned long) ptr);
、動作は未定義です。私は、それ自体が、あなたが取り組んでいるプラットフォームに依存%pとしてこれを行うのポータブルな方法はないと思います。もちろん、単にint型へのポインタをキャストし、六角でそれを表示することができます:
printf("0x%016lx", (unsigned long)ptr);
多分これは(mingwのを使用して、32ビットのWindowsマシンから)興味深いものになります。
rjeq@RJEQXPD /u
$ cat test.c
#include <stdio.h>
int main()
{
char c;
printf("p: %016p\n", &c);
printf("x: %016llx\n", (unsigned long long) (unsigned long) &c);
return 0;
}
rjeq@RJEQXPD /u
$ gcc -Wall -o test test.c
test.c: In function `main':
test.c:7: warning: `0' flag used with `%p' printf format
rjeq@RJEQXPD /u
$ ./test.exe
p: 0022FF77
x: 000000000022ff77
あなたが見ることができるように、%xとキャストを使用し、一方、指定されたサイズのポインタのサイズにゼロ、その後スペースで%のPバージョンパッド、(キャスト及び形式指定子は非常に移植性である)がゼロのみを使用します。
プレフィクス「0x」とポインタのプリントは、あなたが「%の018p」を代入する必要があるかどう補償することに注意します。
私は通常のポインタを表示するには、%xを使用します。私は、64ビット・システムへの移植性がありませんと仮定し、それは、32ビターズのために正常に動作します。
私は、ポインタ表現が正確にポータブルではないので、のポータブルソリューションのためにそこにある答え何見ることに興味を持つだろう。