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处的内存
我的问题是:我如何防止这个分割错误,为什么会发生这个分割错误,我将如何修复它
“\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)