C Segfault无法访问地址处的内存

C Segfault无法访问地址处的内存,c,segmentation-fault,controls,C,Segmentation Fault,Controls,我在下面的代码部分遇到了一个分段错误:(关于这个分段错误,我在一个主题中问了两个问题) 正如您所看到的,即使使用带有if(ptr->obj&&ptr)的控制结构,也要确保ptr(或ptr->obj不会是null指针),但它不会阻止它,并且在我尝试打印ptr->obj值时出现分段错误: 打印ptr->obj,gdb显示: (gdb)打印ptr$1=(LL_节点*)0x149 (gdb)x 0x149 0x149:无法访问地址0x149处的内存 我的问题是:我如何防止这个分割错误,为什么会发生这个分

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

正如您所看到的,即使使用带有
if(ptr->obj&&ptr)
的控制结构,也要确保
ptr
(或
ptr->obj
不会是
null
指针),但它不会阻止它,并且在我尝试打印
ptr->obj
值时出现分段错误:

打印ptr->obj,gdb显示:

(gdb)打印ptr$1=(LL_节点*)0x149

(gdb)x 0x149

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

我的问题是:我如何防止这个分割错误,为什么会发生这个分割错误,我将如何修复它

  • 关于这个segfault,当使用gdb时,我检查了第1帧(segfault发生前一帧),我发现
  • er->cw是
    “\000”
    我的问题是如何控制
    er->cw
    是否不等于
    “'\000”
    如您所见,即使控制结构带有if(ptr->obj | | ptr),也要确保ptr(或ptr->null)不会是空指针

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

    但是这仍然是不对的……您的
    逻辑也错了,代码应该是

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

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

    不……这实际上并不能确保两者都不为空,这将设置seg故障。
    |
    在退出之前将计算两侧,并且您将逻辑设置为反向。您需要
    &
    并且需要翻转它们,否则它将遵循
    空指针:

    if(ptr && ptr->obj)
    

    当我试图打印值ptr->obj时,出现分段错误:
    打印ptr->obj,gdb显示:
    。。。
    0x149:无法访问地址0x149处的内存

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


    er->cw是“\000”我的问题是,如果er->cw不等于“\000”,我如何控制
    这不清楚,您能否显示
    er
    的结构?你是说
    er->cw
    char*
    类型,并且设置为
    “\000”

    0x149
    绝对是无效指针。。。问题在于代码的另一部分没有显示us@Karoly,如何使用gdb我可以找出ox149为什么无效,我的意思是如何使用gdb我可以检查你提到的无效指针?顺便说一句,我的第二部分问题是关于如何用if函数检查cw是否不等于“'\000'重复15次”?顺便说一句,既然你说问题出在代码的另一部分,那你的意思是什么?(如果你说的是函数名,我也会提供源代码。Thanks@All至少我的第二部分问题对这个论坛的很多人来说是简单的!不是,所以50次评论之后,第二部分仍然没有回应,所以如果我检查一下(strlen(er->cw)!=0)此er->cw控件是否有效,以防止值被“\000”重复15次?嗯,不是这样,在版主编辑后(你在第一篇文章中发现了一个拼写错误),在我检查过的代码中,如果(!ptr&&!ptr->obj)这和你说的完全一样,嗯,好吧,我把我的问题限制在一个部分,如果我想检查er->cw,它是数组的字符(数组的长度是15),元素不会为零,我怎么做呢?strlen(er->cw)!='\000'做不做这个工作?这取决于er->cw的用途…如果它是一个文本字符串,那么检查
    if(er->cw)[0]='\0')空字符串
    足以测试空字符串。测试
    if(er->cw==“\0\0\0\0\0\0\0\0\0\0\0\0”)
    是个坏主意。谢谢匿名,检查if(er->cw[0]有什么区别吗=='\0'或'\000'?绝对纯粹主义者会说是有区别,\0是空终止符字符,其中as\000是ascii字符0。但实际上它们是相同的。感谢您的回复,cw是uchar cw[16];(无符号字符)硬件是SH4/STLINUXEARD if(ptr&&ptr->obj)我知道,我说这是版主编辑造成的打字错误!@nimatajfar是的,你还说(在另一条评论中)你尝试了
    (!ptr&&!ptr->obj)
    这是不正确的。我在或编辑中看到,您的意思是没有
    s。SH4是32位硬件,所以您为什么不尝试使用32位地址访问地址?如果这是您的意图,C将不知道填充该地址的方式。因为
    cw
    是一个字符数组,所以您需要逐个字符进行比较或者使用str函数,初始的
    \000
    是一个转义字符,您应该看到
    cw[0]==0
    if ((ptr != NULL) && (ptr->obj != NULL))
    {
       // use the pointer
    }
    
    if(ptr && ptr->obj)