2017-01-05 5 views
-2

ここに住所は何ですか?ここで負のポインタ値は何ですか?

int main(void) { 

    int i = 5; 
    int *p; 
    p = &i; 

    printf("%d\n",*p); 
    printf("%d\n",i); 
    printf("%d\n",p); 
    printf("%d\n",&i); 
    printf("%p\n",p); 
    printf("%p\n",&i); 

    return 0; 
} 

出力:

5 
5 
-7530484 
-7530484 
0xff8d180c 
0xff8d180c 

たものが出力されているが、pが私に-7530484を与え、なぜ私はそれがポインタでなければならないと思いますが、これは0xff8d180c何ですか?あなたのコードで

+5

'printf("%d \ n "、p);' printf( "%d \ n"、&i); 'はUBです。 –

+1

デュプリはまったくデュプリではありません。印刷された「蹄鉄」。 – Quentin

+1

関連:http://stackoverflow.com/questions/1689423/memory-address-positive-or-negative-value-in-c – rsp

答えて

2

printf("%d\n",p); 
printf("%d\n",&i); 

undefined behaviorを呼び出します。それをしないでください。

任意のポインタ型を印刷する理想的な方法は

  • 使用%pフォーマット指定子である
  • は、見出力一部のビットについて詳しく説明するvoid *

に引数をキャスト%dフォーマット指定子とともに提供される引数は、intタイプと解釈されます。ここで提供される引数は実際にはタイプint *(ポインタ型)であり、intint *はUBの原因となる互換型ではありません。この場合、出力の再現性は保証されていません。他のプラットフォーム/環境では他のガベージ値が表示される可能性があります。

+0

これは「理想的」ではありませんが、 – Olaf

+0

@Olaf:私はそれが唯一の方法であるとは言いません。これもうまくいくでしょう: 'printf("%。* "PRIxPTRもちろん、 '%p'メソッドはより簡単で*かつ移植性が高い(' uintptr_t'の存在から)、 '\ n"、(int)sizeof(uintptr_t)、(uintptr_t)ほとんどの場合、それはまだ唯一の方法ではありません)。 –

+0

@TimČas:Y本当にコメントを丁寧に読むべきです。私は明確に "** portable **"と述べました!あなたが書いているように、 'uintptr_t'が存在するという保証はなく、それへのポインタのキャストも有用な値であることを示していません。 – Olaf

関連する問題