2017-10-12 5 views
0

私はいくつかの割り当てられた値 'i'のポインタと、%uと%lu、%lluに2つの異なるアドレスが割り当てられていることを知りました。どの変数が実行の同じインスタンスで2つの異なるアドレスを持つことができる可能性がある -変数はどのようにして同じ時点で2つの異なるアドレスを持つことができますか?

#include <stdio.h> 
int main(void) 
{ 
    int i; 
    float f; 
printf("\nEnter an integer:\t"); 
scanf("%d",&i); 

    printf("\nValue of address of i=%u",&i); 
    printf("\nvalue of address of i=%d",&i); 
    printf("\nValue of address of i=%lu",&i); 
    printf("\nValue of address of i=%llu",&i); 

    printf("\nvalue of i=%d",i); 
    printf("\nvalue of i=%u",i); 
    printf("\nvalue of i=%lu",i); 
    printf("\nvalue of i=%llu\n",i); 

} 

これが出力されます - ここで

[email protected]:~/Desktop/Daily programs/pointers$ ./pointer001 

    Enter an integer: 12 

    Value of address of i=1193639268 
    value of address of i=1193639268 
    Value of address of i=140725797092708 
    Value of address of i=140725797092708 
    value of i=12 
    value of i=12 
    value of i=12 
    value of i=12 

我々ははっきりと見ることができ、その%uのためと%Dアドレスは1193639268です(%dと%uの出力はすべての場合で同じではないかもしれません)。%luと%lluの出力は140725797092708で、物理的な意味は何ですか?

答えて

6

ポインタを印刷するための適切な書式指定子は%pです。間違った形式指定子を使用

など%d%u%lu、または%lluundefined behaviorを呼び出します。あなたが見ている特定の動作として

intまたはunsigned intはおそらく4バイトの値でありながら、あなたの特定の実装上のポインタは、おそらく、8バイトの値です。結果として、%dまたは%uを使用すると、関数に渡された8バイト値の最初の4バイトだけが読み取られ、その値が出力されます。 %luまたは%lluを使用すると、8バイトすべてが読み取られ、そのまま出力されます。

この場合も、定義されていない動作が呼び出されているため、この特定の出力に依存することはできません。たとえば、32ビットモードと64ビットモードでコンパイルすると、結果が異なる可能性があります。 %pを使用し、%pで期待される特定のポインタ型であるため、void *にポインタをキャストすることをお勧めします。

+2

詳細: 'void *'ポインタを出力するための適切な書式指定子は ''%p "'です。 ''%p "'は 'int *'に対しては機能しないかもしれませんが、それでも共通です。 – chux

+1

@chux良い点。その詳細を追加しました – dbush

2

これはありません。ポインタ型に不正な書式指定子を使用しているだけです。

これを行う際の動作は未定義です。あなたが観察する出力は、その未定義の振る舞いの現れです。

%pをポインタに使用し、ポインタの引数をconst void *型にキャストします(多くのコンパイラはこの最後のポイントではlaxですが、これにもかかわらず)。

3

間違った書式指定子を使用していますが、結果はundefined behaviorとなります。この特定の場合に挙動は1193639268(0x47257D64)が140725797092708(0x7FFD47257D64)の下部であることである

アドレスの正しい形式指定子は、1つのアドレスがあり%p

4

あります。さまざまな幅の整数の印刷コードを使用しているため、32ビットのアドレスが表示されることがあり、64ビットのアドレスが表示されることがあります。どのくらい有効かはシステムによって異なります。 32ビットシステムでは、64ビットを出力すると32ビットの値がガベージであることを意味します。 64ビットシステムでは、32ビットを出力するとポインタの半分を省略します。

専用のフォーマットコード%pがあります。これは、印刷ポインタ用であり、整数印刷コードではなく、それを使用します。

関連する問題