main
スタックでは、関数のスタック フレームと呼ばれるメモリが予約されmain
ます。
関数を呼び出すとAdd
、スタックの一番上にメモリが予約されます。Add
関数スタック フレームでは、とa
はb
ローカル ポインターでありc
、合計を計算して参照を返す整数です。c
関数のローカル変数ですAdd
。
関数のAdd
実行が完了すると、スタック内のメモリ空間も割り当て解除されるため、main
with pointerp
でこのアドレスにアクセスしようとすると、アクセスしようとしているのは基本的に割り当て解除されたスペースです。コンパイラは警告を出しますが、それでも値 5 が正しく出力されるのはなぜですか?
それに対する答えは、マシンがメモリ空間の割り当てを解除しなかったということかもしれません。それ以上の機能がなかったため、メモリ空間が必要であると見なされなかったからです。しかし、別の関数を書くと、呼び出しスタック内の関数Hello
のスペースを確実に解放する必要Add
がありますが、プログラムはまだ出力します
Yay 5
ヒープのように、解放後にポインターを割り当てる必要があるためnull
ですか、それともアクセスできますか? ここにそのようなものが関係していますか?
/* void Hello()
{
printf("Yay");
} */
int* Add(int *a,int *b)
{
int c=*a+*b;
return &c;
}
int main()
{
int a=1,b=4;
int *p=Add(&a,&b);
// Hello();
printf("\t%d",*p);
return 0;
}