4

我在下面的代码部分遇到了分段错误:(关于这个 segfault ,我在一个主题中问了 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) 打印点 $1 = (LL_NODE *) 0x149

(gdb) x 0x149

0x149:无法访问地址 0x149 处的内存

我的问题是:如何防止这种分段错误,为什么会发生这种分段错误以及如何解决?

  1. 关于这个段错误,当使用 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'" ?

提前致谢。

4

2 回答 2

3

As you see, even with the control structure with if(ptr->obj || ptr) to be sure ptr (or ptr->null won't be null pointer)

不......这实际上并不能确保两者都不会为NULL,这会使您陷入段错误。将在退出之前||评估双方,并且无论如何您都可以向后设置逻辑。你想要&&并且你需要翻转它们,否则它会尊重可能是NULL指针的东西:

if(ptr && ptr->obj)

在我尝试打印值 ptr->obj 时出现分段错误后:
print ptr->obj ,gdb 说:
...
0x149:无法访问地址 0x149 的内存

我从未见过0x149有效的地址,您在哪个硬件平台上?


er->cw 是 "\000" 我的问题是如何控制 er->cw 不等于 "'\000'

这不清楚,你能展示一下结构er吗?你是说这er->cw是一种char *类型并且设置为"\000 <repeats 15 times>"

于 2013-03-04T14:56:07.470 回答
1

如您所见,即使使用带有 if(ptr->obj || ptr) 的控制结构来确保 ptr (或 ptr->null 不会是空指针)

问题是您进行测试的顺序,编译时ptr->obj首先完成,因此如果ptr为 null 您正在访问无效内存,则获取obj成员。颠倒测试的顺序if (ptr || ptr->obj)

但是那仍然不对...您的OR逻辑也是错误的,代码应该是...

if ((ptr != NULL) && (ptr->obj != NULL))
{
   // use the pointer
}
于 2013-03-04T14:47:27.103 回答