段错误 无法访问地址处的内存

2024-01-05

我在下面的代码部分遇到了分段错误:(关于这个分段错误,我在一个主题中问了两个问题)

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 (or ptr->obj不会null指针),但它并不能阻止它,并且当我尝试打印该值时出现分段错误ptr->obj with:

打印 ptr->obj ,gdb 说:

(gdb) 打印指针 $1 = (LL_NODE *) 0x149

(gdb) x 0x149

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

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

  1. 关于这个段错误,当使用 gdb 时,我检查了帧 1(段错误发生前的一帧),我发现

呃->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' " ?

提前致谢。


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,这会导致段错误。这||会评价both在它退出之前先站在一边,无论如何你都会向后设置逻辑。你自找的&&你需要翻转它们,否则它会尊重什么可能是NULL指针:

if(ptr && ptr->obj)

当我尝试使用以下命令打印值 ptr->obj 时出现分段错误:
打印 ptr->obj ,gdb 说:
...
0x149:无法访问地址0x149处的内存

我从未见过地址0x149有效,你在什么硬件平台上?


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

这个不太清楚,能否请您展示一下结构er?你是这么说的吗er->cw is a char *类型并设置为"\000 <repeats 15 times>"?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

段错误 无法访问地址处的内存 的相关文章

随机推荐