以下のコード セクションでセグメンテーション違反が発生しました: (この segfault に関して、1 つのトピックで 2 つの質問をしています)
req_cw(ECM_REQUEST *er, int32_t flag, int32_t reader_types){
LL_NODE *ptr;
for (ptr = er->matching_rdr->initial ; ptr ; ptr = ptr->nxt) {
if (ptr == er->fail)
break;
rdr = (struct s_reader*)ptr->obj;
we_equest(rdr->fd, er);
}
}
ご覧のとおり、制御構造を使用しif(ptr->obj && ptr)
てもptr
(またはポインターptr->obj
にならないnull
)、それを防ぐことはできず、値を出力しようとしたときにセグメンテーション違反が発生した後ptr->obj
:
print ptr->obj 、gdbは次のように述べています:
(gdb) print ptr $1 = (LL_NODE *) 0x149
(gdb) × 0x149
0x149: アドレス 0x149 のメモリにアクセスできません
私の質問は次のとおりです。このセグメンテーション違反を防ぐにはどうすればよいですか?このセグメンテーション違反が発生する理由と修正方法を教えてください。
- この segfault に関して、 gdb を使用しているときに、フレーム 1 (segfault が発生した 1 フレーム前) を確認したところ、
er->cw私の質問は、が と等しくない"\000 <repeats 15 times>"
場合、どのように制御できますか?er->cw
"'\000' <repeats 15 times"
私はこれをしました、それが正しくないことを知っています(そして私は何かを逃しました)、それが私がここで尋ねる理由です
if (er->cw)
req_cw(er , ...)
問題は追加if(er->cw)
です。は文字であり、整数のように振る舞うべきではないと思いますcw
が、それがゼロでないことを確認する方法がわかりませんか?、つまり、 gdb で確認したときにこの行を再度使用してもer->cw
、値は "'\ 000'" が渡されているので、if 制御ブロックを使用er->cw
して '\000' と等しくない場合を確認するにはどうすればよいですか?
前もって感謝します。