5

この例がどのように機能するかわかりません:

double * GetSalary()  {
  double salary = 26.48; 
  return &salary;
}

main() {
    cout << *GetSalary();  //prints 26.48

}

salaryは のローカル変数でGetSalary()あるため、関数から戻った後、このセルは別の関数によって上書きされる可能性があります。ローカル変数 (ヒープ上でインスタンス化されていない) へのポインターを返すことがどのように機能するかわかりません。

4

6 に答える 6

16

うまくいきません。これは未定義の動作です。「正しい動作」は「考えられる動作」のサブセットであるため、うまくいくように見えるかもしれません。

于 2012-06-21T09:18:25.120 に答える
8

未定義の動作に陥っています。つまり、何かが起こる可能性があります。働くように見えることを含む。

関数の外では、リターン ポインタがぶら下がっています (つまり、ポインタが指すメモリが無効です)。

機能しているように見える理由は、実装に要約されます。ほとんどの場合、メモリはクリアされていません。したがって、リターン ポインターが指すものにアクセスすることはできませんが、そのメモリには26.48まだ存在します。しかし、それはたまたまです。

于 2012-06-21T09:19:35.040 に答える
2
double * GetSalary()  
{   
     double salary = 26.48;    
     return &salary; 
}  
double dummy_function()
{
     double a = 1.1;
     double b = 2.2;
     double c = 0 , d = 0;

     c = a + b - d;
     return c;  
}

main() 
{     
     double *a;
     a = GetSalary();
     cout << dummy_function();
     cout << *a;  //this time it wont print 26.48
} 

2回目の関数呼び出しで関数スタックが上書きされているためdummy_function

于 2012-06-21T09:43:13.873 に答える
1

「機能」しません。無効になったポインターを逆参照しています。指摘されたメモリがたまたま期待値を保持しているということは、プログラム全体が「機能している」または正しいという兆候ではありません。

なぜそれが機能するのかを理解するには、発生するスタック フレーム シフトの正確なパターンを分析する必要があります。

于 2012-06-21T09:19:57.587 に答える
0

これは、未定義の動作引き起こすダングリング ポインターです。 一部のシステムではアプリケーションがクラッシュする可能性があり、他のシステムでは正しく動作しているように見える場合があります。しかし、いずれにせよ、それを行うべきではありません。この同様の SO 投稿 を参照してください。

于 2012-06-21T09:23:43.397 に答える
0

これも機能しますが、はるかに安全です。マルチスレッドプログラムでは正しく動作しません。

double * GetSalary()  {
  static double salary = 26.48; 
  return &salary;
}
于 2012-06-21T17:42:19.660 に答える