#include<stdio.h>
int main()
{
char *a;
char *temp ='55515';
a = &temp;
printf("%s ", a);
}
予想される出力は55515ですが、実際の出力は5155ですか?最初の文字がなくなって出力が反転するのはなぜですか?
#include<stdio.h>
int main()
{
char *a;
char *temp ='55515';
a = &temp;
printf("%s ", a);
}
予想される出力は55515ですが、実際の出力は5155ですか?最初の文字がなくなって出力が反転するのはなぜですか?
'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の場合は、実装定義の振る舞いに依存します。まったく、厳密に準拠したプログラムが依存するものではありません。
''55515 ''は文字リテラルでは長すぎます、' a =&temp'は 'char **'に 'char **'を割り当て、 'i'は未使用です。作業? – Ryan
あなたのコンパイラは*すべての警告を*あなたに与えていませんか? –
'temp =" 555515 "'と 'printf("%s "、temp);' ... –