无效指针有条件提升段

当我们处理前一个或下一个为空的指针时,我使用的是双向链接列表,并且在边缘情况下获得了一些奇怪的性能。 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
听起来不太像是有效指针的值……很可能是调试初始化程序。     
        具体来说,这意味着您正在访问的数据根本没有初始化。问题-这是第一次使用此结构吗? 无论如何,请检查您的初始化代码。创建节点时,我敢打赌第一个没有先前节点的节点,并没有设置其值,但是在上面的代码中,您尝试访问它。     

要回复问题请先登录注册