2017-07-28 10 views
-8
#include<stdio.h> 
int main() 
{ 
    char *a; 
    char *temp ='55515'; 
    a = &temp; 
    printf("%s ", a); 
} 

予想される出力は55515ですが、実際の出力は5155ですか?最初の文字がなくなって出力が反転するのはなぜですか?

+6

''55515 ''は文字リテラルでは長すぎます、' a =&temp'は 'char **'に 'char **'を割り当て、 'i'は未使用です。作業? – Ryan

+8

あなたのコンパイラは*すべての警告を*あなたに与えていませんか? –

+0

'temp =" 555515 "'と 'printf("%s "、temp);' ... –

答えて

1
'55515'は、 intに変換される複数文字定数です。プラットフォームに32ビットの intがあるため、MSBバイトは破棄され、結果の int(int)0x35353135になります。これは、実装定義の方法で charへのポインタに変換されます。あなたのプラットフォームはリトルエンディアンプラットフォームであり、char変換は intの値を保持します。ポインタオブジェクトの が今

temp: 
| 0x35 | 0x31 | 0x35 | 0x35 

または

| 0x35 | 0x31 | 0x35 | 0x35 

としてメモリにレイアウトされているあなたが64ビットまたは32ビットのプラットフォームを使用しているかどうかを控除することはできません。 今、あなたは%sと、文字列のようにポインタオブジェクト、すなわちバイト0x35の最初のバイトを指すchar *に別のポインタ、printfこれを行います。

printf呼び出しには、実装定義の動作または定義されていない動作しかありません。ポインタが32または64ビット幅かどうかによって異なります.32の場合は未定義の動作、64の場合は、実装定義の振る舞いに依存します。まったく、厳密に準拠したプログラムが依存するものではありません。

+0

の答えが正しいことを理解していない無意味なidですが、深刻なコンパイラが警告を出す、または2: – ingconti

+0

コードサンプルを追加 – ingconti

関連する問題