1

リンクリストのノードのアドレスを読み取るコードを書いているので、printfのフォーマットが正しいかどうか%pを確認できます。%u1 つは 16 進数を示し、もう 1 つは 10 進数を示し、16 進数または 10 進数への変換は一致しています。%pまた、誰かがとの違いについて簡単に説明できれば素晴らしいこと%uです。

struct node {
    int x;
    struct node *next;
};

int main () {
    struct node *root;
    struct node *track;

    root = malloc(sizeof(struct node));
    printf ("Location of root is %p\n", root);
    printf ("Location of root is %u\n", root);
}

実行の出力:

[root@vm c_prog]# ./a.out
ルートの場所は 0xdc3010 です
ルートの場所は 14430224 です
[root@vm c_prog]# ./a.out
ルートの場所は 0x11fbf010 です
ルートの場所は 301723664 です
[root@vm c_prog]# ./a.out
ルートの場所は 0x7e8e010 です
ルートの場所は 132702224 です
[root@vm c_prog]#
4

3 に答える 3

2

はい、%p実装が適切であると判断した形式 (通常は 16 進数 - 現在表示されているもの) でポインターを出力し、%u は符号なし整数を出力します。代わりに %x を使用すると、より類似した結果が得られる場合があります。ただし、%p64ビットシステムでは整数と同じではないポインターのサイズも理解してい%uます%x

技術的には、%p「のみ」は void ポインターでも機能します。

于 2013-02-07T16:23:29.760 に答える
2

違いは、%u = unsigned int、%p = ポインターであるということです...これらはシステム/アーキテクチャでは同じサイズではない可能性があり、同じ意味で使用しないでください。

于 2013-02-07T16:20:39.580 に答える
2

%pはポインター用であり、正しいです。厳密には にキャストする必要がありますがvoid *、気にする実装に出会ったことがありません。例:

printf ("Location of root is %p\n", (void *)root);

%uは an 用であり、キャスティング体操を行い、ポインターと anが同じサイズであることが確実でない限り、正しくunsigned intありません。intポインター値を 10 進数で安全に出力するには、PRIuPTRfromを使用する必要がありinttypes.hます。

printf ("Location of root is %"PRIuPTR"\n", (uintptr_t)root);
于 2013-02-07T16:21:51.907 に答える