2016-12-01 3 views
-1

ポインタが存在するかどうかを確認しており、存在する場合はNULL /ゼロ値を指していません。私のコードは次のようになります。文分割エラーの場合

if (prior != NULL && *prior){ 
    //do something 
} 

ここで、priorはポインタです。しかし、*priorにセグメント違反が発生しています。しかし、私はこれがどのように可能であるか理解していません。 if文は、priorがNULLポインタなので、* priorは常に動作するはずです。

アイデア?

+4

おそらくNULLではありませんが、ポインタが無効なアドレスを指していることがあります。 –

+1

コンパイラが未知の識別子について文句を言わない場合は、ポインタ変数**が存在します。あなたの[mcve]はどこですか?あなたが表示する1行に '* prior 'はありません。 – Olaf

+0

ポインタがnullでないという事実は、あなたが逆参照を許されているという意味ではありません。実際には、NULLと比較することさえ許されないかもしれません。 – user2357112

答えて

3
if (prior != NULL && *prior){ 
    //do something 
} 

segfaultには、NULLポインタの逆参照以外の理由があります。ポインタはNULLでなくてもかまいませんが、無効なポインタやぶら下がっているポインタを尊重している場合でも、プログラムはセグメンテーションできます。

再訪ポインタについては、この有名な答え:Can a local variable's memory be accessed outside its scope?

ポインタは、まだ、まだ、無効な非NULLにすることができる理由も説明しています。

+0

[回答を回答に書き直す](https://meta.stackoverflow.com/questions/253045/answerers-who-only-use-comments)は許容される動作です。 –

+1

@ KenY-Nコメントとより完全な回答との間に大きな時間差がない限り、それがリワークだとは言えません。 – artm

+0

@artmこれはオンラインコミュニティであり、あらゆる種類の人がいます。あなたはただの不愉快な人たちのためにあなたの気持ちを落としません。 – fluter

関連する問題