2016-04-05 3 views
0
int x; float *p; 
    p = (float*)&x; 
    *p = 2.35; 
    printf("x:%f\n",x); //0.0000 
    printf("x:%d\n",x); //1075209830 
    printf("p:%f\n",*p); //2.350000 

これはc未定義の動作になりますか?IntとFloatポインタ。誰かが出力を説明することができます

+1

はい、それはUBです。どのようなアウトプットを期待しましたか? –

+3

2つの理由から、1)厳密なエイリアシングルールを壊してしまった。2) 'int'に間違った書式指定子'%f'を使う。 –

+0

私は最初のprintfの説明が必要だと仮定しますが、コンパイラのモードとバージョンに依存する関数への引数の受け渡し方法によってまったく異なります。 vs2015が誤った引数が使用されたという警告を出すことさえあることに気付くかもしれません。 –

答えて

0

まあ、あなたはxを指すアドレスと同様にpを指している&xを持っています。
次に、pの値を変更します。 xを指すように変更してください。逆参照すると、pバイトがfloatとして解釈されます。 (おそらく)sizeof(int) != sizeof(float)であっても、前にもそうでもなくても、いくつかのバイトが評価されることさえあります。
メモリにアクセスするので、C標準には定義がありません。 UB。

さらに、*pに新しい浮動小数点値を割り当てて、このスペースに書いてもintだったとします。
最初にprintf()を評価するとき、コンパイラが混乱していることは驚くことではありません。とにかくUBです。
番目のステートメント少なくとも彼に非矛盾した指示を与える:(floatとしてintを解釈しようとしない)intからintを印刷します。
前にも触れたように、floatintに収まらない可能性があります。したがって、値はいつでも上書きされたり、SEGFAULTが発生する可能性があります。

+1

'x'はポインタではありません。 – mch

+0

@mch oops sryは、 – larkey

+0

を修正します。どうも! @mch – larkey

関連する問題