1

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

私はC++で次のコードを持っています

int* foo()
{
    int myVar = 4;
    int* ptr = &myVar;
    return ptr;
}

int main()
{
   printf("val= %d", *foo());
   return 0;
}

私が得る出力は次のとおりです。

val = 4

私の質問は、 myVar はローカル変数であるため、関数が戻った後に消えてはいけませんか? それへのポインタもヌルポインタであってはなりませんか?

4

4 に答える 4

2

あなたの場合、printf("val= %d", *foo())ガベージ値を出力しています。他にコードがないので、そのデータは変更されていません。

このコードを実行すると、アイデアが得られます

    int* foo() 
    { 
        int myVar = 4; 
        int* ptr = &myVar; 
        return ptr; 
    } 

    int* foo1() 
    { 
        int myVar = 5; 
        int* ptr = &myVar; 
        return ptr; 
    } 
    int main() 
    { 
        int* x = foo();
        int* x1 = foo1();
       printf("val= %d", *x); 
       return 0; 
    } 
于 2012-04-06T04:41:42.737 に答える
2

myVar はローカル変数であるため、関数が戻った後に削除する必要がありますか?

はい。設定したアドレスを指します。ただし、リージョンは関数に対してローカルでした。それが指すものが範囲外になった後、それがあなたに属していないと仮定します。

次のように正しくありません。

uint8_t* p = (uint8_t*)malloc(count);
free(p);
p[0] = 1;

ただし、領域がスタック上に存在するため (最適化されていない限り)、ツールで診断するのははるかに困難なエラーです。

それへのポインタもヌルポインタであってはなりませんか?

いいえ、C と C++ はこれを管理しません。

于 2012-04-06T02:31:30.220 に答える
0

ptr* のアドレスは割り当てられたままになり、関数を再度呼び出すと、ポインターが変更されます。少なくともそれが私の理論です。C++ は、パフォーマンス上の理由からポインターを上書きしません。

int foo(int val) {
  int myVar = val;
  int* ptr = &myVar;
  return ptr; 
}

int main()
{
   int *ptr = foo(4);
   foo(3);
   printf("val= %d", *ptr); //will print 3
   return 0;
}
于 2012-04-06T02:35:16.177 に答える
0

int myvarとその関数に属する他のローカル変数を保持していたアドレスを含むメモリは、関数が返された瞬間に割り当てられませんが、C にはクリーンアップ手順がないため、メモリ内の値は返されるまでのわずかな時間の間変更されません。それにアクセスするprintf。

C でメモリの割り当てを解除 (または同じことを解放) することは、Windows でファイルを削除するようなもので、ファイルの内容は当分の間ドライブ上に残りますが、その領域が別の目的で再度必要になると上書きされます。内容を読むことはできますが、読んだ内容を信用すべきではありません。

于 2012-04-06T03:10:42.917 に答える