0

次のコードがあるとしましょう。stはグローバルスタックであり、適切に初期化されます。foo()を呼び出します

struct stack *st;

int foo() {
    int x = 1;
    stack_push(st, &x);
}

これで、スタックにはxへのポインターが含まれます。fooがスコープ外になると、アドレス&xはどうなりますか?割り当てが解除されていますか?後でスタックをpop()して参照を解除したときに、値が1になると信頼できますか?

編集:これが私が現在考えていることです。xはスタックに割り当てられるため、スコープ外になると、アドレス&xで占有されているメモリは誰でも使用できます。したがって、後でpop()によって返される逆参照値は1ではない可能性があります。

4

2 に答える 2

2

ポイントfooリターンでの動作は未定義です。多くの場合、値は、次のメソッド呼び出しがそれを上書きするのに十分な大きさのスタックを作成するまで維持されます。しかし、これに依存することは間違っており、行われるべきではありません。

xそれより長く生きる必要がある場合fooは、ヒープ上でメモリを割り当てる必要があります

于 2013-03-08T05:48:23.940 に答える
0

グローバル スタックは、グローバル スタックが破棄されるまで、常に x を指すポインターを保持します。しかし、foo が範囲外になった後、以前に x によって占められていたスタック スペースは再利用される可能性があります。foo() の再入力、その他の関数の呼び出し、またはその他のスタック領域の割り当てが原因である可能性があります。

于 2013-03-08T06:41:48.947 に答える