【发布时间】:2013-02-18 15:17:26
【问题描述】:
我在下面的代码部分遇到了分段错误:(关于这个分段错误,我在一个主题中提出 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:
打印 ptr->obj ,gdb 说:
(gdb) print ptr $1 = (LL_NODE *) 0x149
(gdb) x 0x149
0x149:无法访问地址 0x149 处的内存
我的问题是:如何防止这种分段错误,为什么会发生这种分段错误以及如何解决?
- 关于这个段错误,当使用 gdb 时,我检查了第 1 帧(发生段错误之前的一帧),我发现
er->cw 是"\000 <repeats 15 times>"
我的问题是如果er->cw 不等于"'\000' <repeats 15 times",我该如何控制?
我这样做了,我知道这是不正确的(我错过了一些东西),这就是我在这里问的原因
if (er->cw)
req_cw(er , ...)
问题在于添加if(er->cw)。我认为 cw 是字符,我不应该表现得像 integer ,但我不知道如何检查它是否不为零?我的意思是,即使当我检查 gdb 时再次使用这一行,仍然 er->cw "'\000'" 的值正在传递,那么如何使用 if 控制块检查 er->cw 何时不等于 '\000'"?
提前致谢。
【问题讨论】:
-
0x149绝对是一个无效的指针...问题出在您没有向我们展示的代码的另一部分 -
@Karoly ,我如何使用 gdb 找出 ox149 为什么无效,我的意思是如何使用 gdb 我可以检查你提到的无效指针?顺便说一句,我的第二部分问题是关于如何使用 if 函数检查 cw 是否不等于“'\000' 重复 15 次”?顺便说一句,既然你说问题出在代码的另一部分,你的意思是什么? (如果你说函数名,我也会提供那个源代码。谢谢
-
@All 至少我的第二部分问题对这个论坛的许多人来说都很简单!不是,所以在 50 次审查之后,没有回复第二部分,所以如果我用 if(strlen(er->cw) != 0) 检查这个控件是否对 er->cw 有效,以防止值为 '\ 000 重复 15 次?
标签: c segmentation-fault controls