1

なぜ出力がそのようなものになるのか誰が知っていますか?
そのようなポインターを使用するのは間違っていますが、なぜそのように動作するのかを理解したいと思います。

int* foo()
{
    int a=9;
    int *p=&a;
    //definitely not right to return a pointer to an invalid varible
    return p;
}
int main(int argc, char* argv[])
{
    int *p=foo();
    cout<<*p<<endl;//9
    cout<<*p<<endl;//2357228
    *p=2;
    cout<<*p<<endl;//2
    (*p)++;
    cout<<*p<<endl;//2357229
    cout<<*p<<endl;//2357228
    cout<<*p<<endl;//2357228
    (*p)++;
    cout<<*p<<endl;//2357229
    cout<<*p<<endl;//2357228

    return 0;

}
4

3 に答える 3

2

関数のローカル変数へのポインター/参照を返すと、Undefined Behaviorが発生します。ローカル/自動変数は、そのスコープを超えて定義されていない スコープ ( {、 ) でのみ、有効で有効であることが保証されます。}

未定義の動作とは、プログラムが任意の動作を示すことができ、C/C++ 標準によって許可されていることを意味します。未定義の動作が発生した後に観察された動作の理由を見つけようとしても意味がありません。頼ることはできません。

明るい面としては、優れた商用コンパイラは、そのようなコードに関する警告を提供します。

于 2012-10-24T03:26:19.243 に答える
1

そのようなポインターを使用するのは間違っていますが、なぜそのように動作するのかを理解したいと思います。

cout の << メソッドによって上書きされ続けるスタック メモリ内の場所を p が指しているからです。cout を使用するたびに、p の値が変わる可能性があります。

このようなコードは、スタックを破壊し、プログラムをクラッシュさせる可能性があるため危険です。

于 2012-10-24T03:39:50.063 に答える
0

覚えておく必要があるのは、aとpはどちらもスコープレベルの変数であるということです。したがって、スタックにのみ存在する(ただし、ヒープに動的に割り当てられない)変数のアドレスを返すことは、未定義の動作です。そのアドレス空間を離れると、そこに何が書き込まれるかがわからなくなったためです。エルゴ、ローカル変数へのポインタを返すことは未定義の動作です。

于 2012-10-24T03:20:10.907 に答える