0

私の関数には未定義の動作がありますか? ローカル変数 c があるため、自動ロケーションにあるため、関数の実行後に破棄されますか? (範囲の終わり)

int* calculate(int* a,int* b)
{
  int c=(*a)+(*b);  //local variable c
  return &c;
}
int main()
{
  int a=12;
  int b=23;
  int* ptr=calculate(&a,&b);
  std::cout<<*ptr<<endl;
}
4

2 に答える 2

2

はい、一時的なローカル オブジェクトへのポインターを返し、未定義の動作である逆参照を行います。

function を終了した後calculate、そのオブジェクトはスコープ外になり、自動的に破棄されるため、提供されたポインターは無効なアドレスを指し、ダングリング ポインターになります。その後、逆参照を使用して使用できます(例:*ptr)。

あなたの場合、通常の変数を使用して、それらを削除できます*

int calculate(int *a, int *b)
{
  int c = (*a)+(*b);
  return c;
}

それらをポインターで渡すのに合理的なものがないため、 more を削除することをお勧めします*

int calculate(int a, int b)
{
  int c = a + b;
  return c;
}
于 2013-10-21T07:21:52.993 に答える