2011-02-02 21 views
1

私はこのコードが間違っていることを認識しています。 しかし、私は誰かが説明できるかどうか私が疑問に思っていた好奇心をそそぐいくつかの行動に出くわしました。scanfの不思議な振る舞い

例1:

char *foo; 
    scanf("%s",foo); 
    printf("%s",foo); 

出力される。(ヌル)

例2:

int i; 
    char *foo; 
    scanf("%s",foo); 
    printf("%s",foo); 

出力は次のようになります。FOOのヴァル!

int iの存在が、なぜ「動作する」の原因になるのでしょうか?

+2

動作しません。あなたが期待していることをしているように見えますが、それは未定義の動作なので重大なバグです。 – delnan

+1

投稿した内容から、fooは価値がありません。割り当てられていないメモリへのポインタです。 – SlappyTheFish

+0

私はあなた自身のプログラムでこの種のバグを見つけたのはかなり厄介なことだと思います。 ;) – BlackBear

答えて

6

fooはポインタですが、割り当てたメモリを指すように設定していないため、起動時にランダムな値を持つだけで、ランダムなメモリセクションを指しています。したがって、何かが発生する可能性があります(つまり、未定義の動作)。

int iの存在は、スタック上のfooの位置を変更するだけであり、それゆえにそれが持つ特定のランダムな値です。この異なる動作に意味のあるものは読んではいけません。未だ定義されていません。

関連する問題