0

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

入力:

#include <stdlib.h>
#include <stdio.h>
int func2(void);
int* func1(void);

int func2(void)
{
    int* b;
    b = func1();
    printf("%d", *b);
    printf("%d", *b);
    printf("%d", *b);
}

int* func1()
{
    int a = 13;
    return &a;
}

int main()
{
    func2();
}

出力:

13 -1077824828 -1077824828

誰かがスタックとOSで何が起こったのか説明できますか?ポインタの値を取得した後、結果が13からガベージに変わったのはなぜですか?

4

2 に答える 2

1

printfを呼び出すと、以前にが占めていた場所を上書きする新しいスタックフレームが作成されaます。

于 2012-09-13T21:05:57.580 に答える
1

もちろん。結果は、デバッグとリリース(クリーン)で異なります。ローカル変数はEBPです-アセンブリを見ると(多少のオフセット)。これは、「さらに」のように、スタックが高いことを意味します。

これはあなたが返すアドレスです。

通常、関数が戻るだけの場合は変更されません。一部のコンパイラのデバッグビルドでは、ダングリングポインタエラーをより迅速にキャッチできるように、意図的にガベージされます。現在、printf呼び出しは、スタック内の同じアドレスを再利用して、パラメーターを渡し、独自のローカル変数(いくつかあります)を渡します。これらは、func1 returnによって空にされたアドレスに書き込まれるため、取得したアドレスが指すものはすべて上書きされます。

于 2012-09-13T21:06:15.920 に答える