0

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

以下のプログラムでこの出力が得られる理由を理解しようとしています

[hello] [0xbfde68f4]
[world] [0xbfde68f4]
[world] [0xbfde68f4]

プログラムは

int main(void)
{
    char **ptr1 = NULL;
    char **ptr2 = NULL;

    ptr1 = func1();
    ptr2 = func2();
    printf(" [%s] [%p]\n",*ptr1, (void*)ptr1);

    printf(" [%s] [%p]\n",*ptr2, (void*)ptr2);

    printf(" [%s] [%p]\n",*ptr1, (void*)ptr1);

    return 0;
}

char** func1()
{
    char *p = "hello";
    return &p;
}

char** func2()
{
    char *p = "world";
    return &p;
}

ローカル変数のアドレスを返すのは良い習慣ではないことは理解していますが、これは単なる実験です。

4

3 に答える 3

1

メモリアドレスは再利用されます。最初に「hello」を保持する定数のアドレスを保持し、次に「world」を保持する定数のアドレスを保持するために再利用します。

メモリが使用されなくなったら、再利用できます。一般に、最近使用したメモリを再利用するのが最も効率的であるため、コンパイラとメモリ マネージャーは通常、これを実行しようとします。

絶対に保証するものではないことに注意してください。このプログラムがクラッシュしたり、別のコンパイラやプラットフォームで別のアドレスを提供したりすることがあります。ただし、両方の変数がローカルでスタックに割り当てられており、介在するコードがスタック スペースを使用しないため、この特定のシナリオでは再利用の可能性が非常に高くなります。間にスタック スペースの使用を追加すると、異なる動作が得られます。

于 2012-08-09T04:25:28.083 に答える
0

ローカル変数はスタック上に存在します。func1() を呼び出すと、ローカル変数が作成され、スコープ外になると破棄されます。func1() がもう使用していないため、 func2() はそのローカル変数に同じスペースを使用していました。

于 2012-08-09T04:26:51.257 に答える