0

重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?

関数内で変数のアドレスを返すのは良くありません。変数が属するスタック フレームが終了すると、その変数は存在しなくなるからです。

では、なぜこのコードがうまく機能するのか

int* test(){
    int a = 11;
    return &a;
}

int main(){

    int *a;
    a = test();

    cout << *a;

    return 0;

}
4

2 に答える 2

5

では、なぜこのコードがうまく機能するのか

未定義の動作は、コードが正常に動作しているように見えることを意味します。しかし、それはまだ定義されていません。

あなたの場合、aダングリングポインターです。

于 2012-08-08T18:07:14.970 に答える
0

コードはまだ間違っています。今は動いているように見えるかもしれませんが、来週は動きません。今は機能しているように見えますが、小さなことを 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は、関数が終了するとスコープ外になり、有効ではなくなります。それへの参照を維持しても、これは変わりません。

于 2012-08-08T18:08:16.420 に答える