重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?
関数内で変数のアドレスを返すのは良くありません。変数が属するスタック フレームが終了すると、その変数は存在しなくなるからです。
では、なぜこのコードがうまく機能するのか
int* test(){
int a = 11;
return &a;
}
int main(){
int *a;
a = test();
cout << *a;
return 0;
}
重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?
関数内で変数のアドレスを返すのは良くありません。変数が属するスタック フレームが終了すると、その変数は存在しなくなるからです。
では、なぜこのコードがうまく機能するのか
int* test(){
int a = 11;
return &a;
}
int main(){
int *a;
a = test();
cout << *a;
return 0;
}
では、なぜこのコードがうまく機能するのか
未定義の動作は、コードが正常に動作しているように見えることを意味します。しかし、それはまだ定義されていません。
あなたの場合、a
ダングリングポインターです。
コードはまだ間違っています。今は動いているように見えるかもしれませんが、来週は動きません。今は機能しているように見えますが、小さなことを 1 つ変更すると、「機能」しなくなります。
これを試して。別の関数を追加しますtest2
:
int *test()
{
int a = 11;
return &a;
}
int test2()
{
int b = 13;
}
int main()
{
int *a;
a = test();
cout << "after test: " << *a << endl;
test2();
cout << "after test2: " << *a << endl;
return 0;
}
今は11
両方とも印刷されていますか?それでも 2 回印刷される可能性11
がありますが、おそらくそうではないことに注意してください。結局のところ、ここではまだ未定義の動作をいじっています。
しかし、私のマシンでは、次のように表示されます。
after test: 11
after test2: 13
test2
ぶら下がっているポインターが指していたスタック上のスペースを壊しました。コードが正しくありません。関数内で定義された変数test
は、関数が終了するとスコープ外になり、有効ではなくなります。それへの参照を維持しても、これは変わりません。