Segfault无法访问地址内存

时间:2013-03-04 13:55:19

标签: c segmentation-fault controls

我在下面的代码部分遇到了分段错误:(关于这个段错误,我在一个主题中提出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)x 0x149

     

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

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

  1. 关于这个段错误,当使用gdb时,我检查了第1帧(发生segfault之前的一帧),我想出了
  2. 呃 - &gt; cw是"\000 <repeats 15 times>" 我的问题是如何控制er->cw是否不等于"'\000' <repeats 15 times"

    我这样做了,我知道这不正确(我错过了一些东西),这就是我在这里问的原因

    if (er->cw)
    req_cw(er , ...)
    

    问题在于添加if(er->cw)。我认为cw是字符,我不应该像整数一样,但我不知道如何检查它不是零?我的意思是,当我用gdb检查时,即使再次使用此行,仍然{值为“'\ 000'”的{1}}正在传递,那么如果控制块我可以检查er->cw何时不等于'\ 000'“?

    提前致谢。

2 个答案:

答案 0 :(得分:2)

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,这会导致你出现seg故障。 ||会在退出之前评估 两个 ,并且无论如何都会向后设置逻辑。你想要&&并且你需要翻转它们,或者它会尊重可能是NULL指针:

if(ptr && ptr->obj)

  
    当我尝试打印值ptr-&gt; obj时出现分段错误

:       
print ptr-&gt; obj,gdb说:     
...     
    0x149:无法访问地址0x149的内存

  

我从未见过0x149的地址有效,您在使用什么硬件平台?


  

er-&gt; cw是“\ 000”我的问题是如何控制er-&gt; cw是否不等于“'\ 000'

目前尚不清楚,您能否展示er的结构?您是说er->cwchar *类型并且设置为"\000 <repeats 15 times>"吗?

答案 1 :(得分:1)

  

如您所见,即使控制结构使用if(ptr-> obj || ptr)来确保ptr(或者ptr-&gt; null也不是空指针)

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

的顺序

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

if ((ptr != NULL) && (ptr->obj != NULL))
{
   // use the pointer
}