2017-08-21 3 views
-4
#include<iostream> 
using namespace std; 
void test(int *s){ 
    s++; 
    *s=3; 
} 
int main(){ 
    int s=0; 
    test(&s); 
    cout<<s; 
    return 0; 
} 

出力はです。私は0しか期待していませんでしたが、テスト関数でsに割り当てられた値に等しいゼロを得ています。私はなぜこの出力を与えるのか理解できません。次のプログラムの出力はどのようになりますか?

が編集されました。

+0

's ++ 'はメモリ内の有効な場所を指していないので、あなたのプログラムは*未定義の動作*を示します。 – dasblinkenlight

+2

コンパイルされないので、出力は表示されません。 –

+1

[nasal demons](http://www.catb.org/jargon/html/N/nasal-demons.html)を参照してください。 – scohe001

答えて

3

未定義の動作は未定義です。mainのように呼び出された場合、testは無効なポインタを使用して書き込みます。何かが起こる可能性があります。

3

プログラムに未定義の動作があります。

s++; 

は、ポインタではなく、ポインタが指すオブジェクトの値をインクリメントします。

して、行

*s=3; 

新しい場所のにポインタポイントに値を変更しました。それはあなたがアクセスするはずのメモリにアクセスすることです。

2

テスト関数の引数には&が渡されたので、* sは実際の値ですが、インクリメントしたときにポインタは未定義の場所に移動したため、出力は何でもかまいません。行s ++を削除すると、答えとして3が得られます。

+0

私はこのことをよく知っています。これはs ++を削除した後、出力として3を得ます。しかし、なぜ私は1の代わりに3 '0'を得るのか尋ねています。質問を理解してみてください。 –

関連する問題