2017-02-13 2 views
0

次のCコードがなぜ機能するのか分かりません( '53'をプリントします)。私はint aがスタックに置かれ、foo()が終了するとすぐに消去されると考えました。コンパイラが代わりにのヒープに配置している場合は、それを知らない方法がありますか?コンパイラがメモリをヒープに配置していますか?

#include "stdio.h" 

int * foo() 
{ 
    int a = 53; 

    int * b = &a; 

    return b; 
} 

int main(void) 
{ 
    int * c = foo(); 

    printf("%d\n",*c); 

    return 0; 
} 
+1

これはまさに何が起こるかです。このプログラムには未定義の動作があります。 – Jon

+1

あなたはただ運がいいですか? 'a' aka' b'がスタックにあった - 今あなたは未定義の振る舞いの世界に住んでいる。 –

+1

別の関数を呼び出す必要がある。あなたのスタックポインタは何か他のものでそれを上書きする理由がありませんでした。 – jiveturkey

答えて

1

整数aがスタックに格納されます。これが機能する理由は、fooaのアドレスを返し、mainaのアドレスの内容を上書きする前にこのアドレスを逆参照して印刷するためです。このプログラムは、この例では偶然に動作します。プログラムの有効期間中にaの値を保持する場合は、static修飾子をaの宣言に適用するか、ヒープにaを割り当てる必要があります。

関連する問題