0

次のコードがありましたが、何をなぜ出力するのかわかりません。

int main(){
   int *i;
   int *fun();
   i=fun();
   printf("%d\n",*i);
   printf("%d\n",*i);
}

int *fun(){ 
   int k=12;
   return(&k);
}

出力は 12 であり、ガベージ値です。誰かが出力を説明できますか?

両方ともガベージ値を返すべきではありませんか?

私はそれkが にローカルであることを知っているfun()ので、スタックに格納されfun()、スコープ外になると破棄されることになります。ここで欠けている概念は何ですか?

4

2 に答える 2

5

どちらの場合もガベージ値を返さないのでしょうか?

が返された後、funkもう存在しないため、 のアドレスに格納されている値を出力することk未定義の動作です。

そのため、異なる/ゴミの価値があります。

k は fun() に対してローカルであるため、スタックに格納され、楽しみが終了するとアクティブ化が破棄されますか、それとも概念がありませんか?

スタックがすぐに「無効化」されない、またはこのようなものではないという事実を除いて、何も見逃していません。つまり、 が返された後fun、コンパイラはこのメモリを使って自由に好きなことを行うことができます。

于 2012-08-12T19:52:23.377 に答える
4

関数が返されたときにスタックはすぐにクリアされないため、関数が返された後も、他の​​何かが上書きするまで12スタックに残ります。fun()

異なるコンパイラと異なるビルド オプション (デバッグとリリース) では、異なる結果が表示されます。

于 2012-08-12T19:55:25.677 に答える