0

これはセグメンテーション違反を引き起こすはずではありませんか?コードを実行すると、出力は 5 です。例: http://ideone.com/gV2Nv

#include <iostream>
using std::cout;
using std::endl;

int* foo(int a) {
  int b = a;
  int* c = &b; 
  return c;
}

int main() {
  int* a = foo(5);
  cout << *a << endl; 
  return 0;
}
4

3 に答える 3

3

関数内のローカル変数へのポインターを返すことは、未定義の動作です。

未定義の動作は、セグメンテーション違反を保証しません。これは、任意の動作が可能であり、プログラムが任意の方法で動作できることを意味するだけです。

未定義の動作は、コードがセグメンテーション違反を生成する必要があることを意味するというのはよくある誤解です。実際には、コードが未定義の動作を呼び出す場合、標準は特定の動作を必要としないため、名前が付けられます。

C++ 標準セクション 1.3.24 には次のように記載されています。

許容される未定義の動作は、状況を完全に無視して予測不可能な結果を​​もたらすことから、翻訳中またはプログラム実行中に環境に特有の文書化された方法で動作すること (診断メッセージの発行の有無にかかわらず)、翻訳または実行の終了 (診断メッセージの発行を伴う) にまで及びます。診断メッセージの)。

于 2012-05-08T04:24:23.073 に答える
2

いいえ、未定義の動作が発生するはずです。

于 2012-05-08T04:23:45.710 に答える
1

そのメモリ アドレスがスコープ外になったときにスタックの一番上からポップされるという事実は、それが解放され、上書きされないことを意味するだけです。そのため、出力「5」が得られます。

于 2012-05-08T04:26:08.243 に答える