C でスタック フレームを理解しようとしているので、スタック フレームを分析する簡単な C コードを書きました。
まず最初に、fun1() は 10 に初期化されたローカル変数のアドレスを ptr に返しますが、これは警告につながりますが、それは問題ありません... *ptr の値を出力すると、10 が出力されますが、それでも問題ありません.. .
次の fun2() は、初期化さえされていないローカル変数のアドレスを返します。 *ptr の値を出力しようとすると、a または b のアドレスを返すかどうかに関係なく、10 が出力されます...
ここで実際に何が起こっているのかを理解するために、gdb を利用しました。gdb を使用して、段階的なデバッグを開始し、fun2()の「 return &a 」の行に到達したとき、b のアドレスを出力しようとしましたが 、 &bを出力しようとしましたが、 Can't take address of "b" which is not を出力しました左辺値。
a のアドレスを出力しようとすると、 &aを出力するとまったく問題なく出力されるのに、なぜ b のアドレスが出力されないのかわかりません。* a が左辺値であるのに b が左辺値でないのはなぜですか?
# include <stdio.h>
int * fun1() {
int a = 10;
return &a;
}
int * fun2()
{
int a;
int b;
return &a; // return &b;
}
int main ()
{
int *ptr;
ptr = fun1();
ptr = fun2();
printf ("*ptr = %d, fun2() called...\n", *ptr);
return 0;
}