如何解决无效指针有条件提升段
当我们处理前一个或下一个为空的指针时,我使用的是双向链接列表,并且在边缘情况下获得了一些奇怪的性能。 GDB返回以下错误:Program received signal SIGSEGV,Segmentation fault.
0x0804a9c1 in DLinkDelete (delete=0xd8c9d33c) at test.c:213
213 if (prevdl && prevdl->next)
(gdb) p prevdl
$39 = (DoubleLink *) 0xdadadada
(gdb) p prevdl->next
$40 = (void *) 0x0
DoubleLink是具有以下格式的结构:
typedef struct
{
void *next;
void *prev;
} DoubleLink;
为什么在这里会出现分割错误?
解决方法
大概“ 2”指向无效的内存?来吧,
0xdadadada
对您来说真的像一个有效的地址吗? \\\\\\\\\\\“它太白痴以至于不能成为精神分裂症\”。
, 0xdadadada
地址看起来很奇怪,尽管它不是NULL。也许您正在尝试读取不允许您使用的内存。
, 价值:
0xdadadada
与实际的指针值不同,它看起来可疑。仅仅因为指针不是NULL并不意味着它是有效的。而且,如果使用无效的指针,则会出现aseg错误或其他任何错误。
, 0xdadadada
看起来有点可疑,也许prevdl
还没有正确初始化?也许它已经被其他一些代码踩了。
也许您应该尝试在valgrind下运行测试,看看它是否报告任何内容?
, 0xdadadada
听起来不太像是有效指针的值……很可能是调试初始化程序。
, 具体来说,这意味着您正在访问的数据根本没有初始化。问题-这是第一次使用此结构吗?
无论如何,请检查您的初始化代码。创建节点时,我敢打赌第一个没有先前节点的节点,并没有设置其值,但是在上面的代码中,您尝试访问它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。