2016-04-08 9 views
-3

は、ここでのコード例です。 ( - はgetNumberが呼び出されたメモリを読み出し専用の機能があっても)ダングリングポインタとセグメンテーションフォールト

1 
10 

をそれはまた、セグメンテーションフォールトが発生する可能性があります私はそのプログラムを実行すると、それが印刷されます。

  1. ptrが指すメモリ位置が他のオブジェクト(プログラム)によって割り当てられていない場合、セグメント化エラーはありません。それを説明する方法?
+4

これは「未定義の動作」と呼ばれます。基本的に、文字通り何かが起こる可能性があります。私は値が同時に真と偽の両方として扱われる原因となったケースを見てきました。 – Claudiu

+3

ところで、あなたが見せているコードは、ぶら下がっている*ポインターをコモンズの意味ではスポーツしていません。これは通常、初期化されていない*ポインタと呼ばれます。ぶら下がっているポインタは、いつか前に有効だったものですが、それ以上はありません。 – SergeyA

+1

C++では、ポインタを使う理由はほとんどありません。 – IInspectable

答えて

2

ptrは決して初期化されないので、コード、データ、スタック、マップされていないメモリ、マップされているが使用されていないメモリは指している可能性があります。つまり、ptrメンバ変数のアドレスには、ランダムな残存データ、コンパイラまたはヒープ実装によって生成された特別な値、または?

このような状況でセグメンテーション違反が発生する理由、またはセグメンテーション違反が発生しない理由を推論することは、ほとんどの場合、特に有用ではありません。ただしないでください。これは「未定義の動作」であり、予測できないことが起こる可能性があります。

+1

よく見落とされること:未定義の動作は、その原因となる単一のステートメントだけでなく、プログラム全体に適用されます。あなたがUBを誘発すると、あなたは一度の保証なしに残されます。 – IInspectable

+1

ところで、これらの状況で実際に何が起こったのかを理解することは、クラッシュを調査する際に役立ちますが、「しない」というアドバイスは依然として適用されます。そして、何が起こるかの理解には、コンパイラ、コンパイラの設定、OS、周囲のコード、およびその他の多くの要素に「依存する」ことが必然的に含まれます。結果は、実行ごとに異なることがよくあります。 –

関連する問題