gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:11:28 25 4
gpt4 key购买 nike

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

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: Cannot access memory at address 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'”正在通过,那么如果控制块我可以检查何时 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,这会让您遇到段错误。 ||将评估 两者 在它退出之前,您将逻辑设置为向后。您想要的 &&你需要翻转它们,否则它会尊重可能是 NULL 的内容。指针:

    if(ptr && ptr->obj)

    after segmentation fault when I tried to print the value ptr->obj with:
    print ptr->obj , gdb says :
    ...
    0x149: Cannot access memory at address 0x149



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

    er->cw is "\000 " my question is how could I control if er->cw won't be equal of "'\000'



    这不是很清楚,你能显示 er 的结构吗? ?你是说 er->cwchar *类型并设置为 "\000 <repeats 15 times>" ?

    关于c - 段错误无法访问地址处的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15203184/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com