2016-12-01 15 views
1

そのアドレスを取るには、このようなコードを考えてみましょう。したがって、&*ptrは同じ方法でメモリにアクセスしていません。それはなぜですか?そのための標準的なエントリがありますか?無効なポインタにアクセスすると

+1

"明らかに' auto val = * ptr; 'はsegfaultです。"それは?あなたは、コードが不完全であることを発見するのがはるかに容易になるので、セグメンテーションすることを望みます*未定義の振る舞い*(これは逆参照演算子をコンテナのエンドイテレータに適用したときに起こりました)それがセグメンテーションされたり、「働く」という外観を持っていたり、何か他のものがあるという保証はありません。振る舞いは* undefined *です。あなたは行動の定義を除いて*何かを排除することはできません。 – WhozCraig

答えて

5

戻り値std::vector::end()を参照解除すると、未定義の動作が発生します。あなたがそうしたら何が起こるのかを理解しようとすることは何の意味もありません。

http://en.cppreference.com/w/cpp/container/vector/endから:この要素は、プレースホルダとして機能

。アクセスしようとすると、未定義の動作が発生します。

Re。第二の部分は、私はC++ 11標準で見つけることができる唯一のものである:

1単項*オペレータが間接を行う

5.3.1単項演算子:式れます適用されるのは、オブジェクト型へのポインタ、または関数型へのポインタであり、結果は、式が指すオブジェクトまたは関数を参照する左辺値です。式の型が「Tへのポインタ、」結果の型は「T」である[注:ポインタ不完全型(以外CVvoid)に逆参照することができます。このようにして得られた左辺値は、限定された方法で(例えば、参照を初期化するために)使用することができる。この左辺値を prvalueに変換してはなりません。4.1を参照してください。 - エンドノート]

NULLポインタを逆参照の結果は不定であると思われます。

+1

これは問題ではありません。 2番目の例を参照し、segフォルトがない理由を説明してください。 – PRP

+0

@PRP、最初の質問はそれだけです。 –

+1

'auto addr =&(* ptr);'を実行している間は、最初に逆参照されたポインタではなく、次にアドレスが計算されます。はいの場合、ポインタの参照解除によってseg faultが発生しないのはなぜですか? – PRP

3

どちらの場合も、メモリにアクセスするのではなく、アドレスを計算することになります。そのため、コードが動作します。しかし、どちらの場合も、C++標準による未定義の動作です。最初の例は、実際には、標準ライブラリのDebugバージョンでアサーションの失敗を引き起こす可能性があります。

+0

これは疑問です:その場合、標準ではこの区別(メモリとコンピューティングアドレスの比較)が行われますか? –

+1

標準には区別がありませんが、どちらも未定義の動作です。しかし、実際には、プログラムがメモリの内容を読み取る必要がある場合にのみ、セグメンテーションが存在します。 – Eugene

関連する問題