void指针条件提升段错误

时间:2011-05-31 16:46:01

标签: c c99 void-pointers

当我们处理前一个或下一个为空的指针时,我正在使用一个双链表并获得有关边缘情况的奇怪性能。 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;

为什么会出现分段错误?

6 个答案:

答案 0 :(得分:5)

据推测prevdl指向无效记忆?来吧,0xdadadada真的看起来像是一个有效的地址吗? “精神分裂症太愚蠢了。”

答案 1 :(得分:0)

0xdadadada地址虽然不是NULL,但看起来很奇怪。也许你正试图读取一个不允许你的记忆。

答案 2 :(得分:0)

价值:

0xdadadada

看起来与真正的指针值不同。仅仅因为指针不是NULL并不意味着它是有效的。如果使用无效指针,则会出现aseg错误或其他错误。

答案 3 :(得分:0)

0xdadadada看起来有点可疑,或许prevdl未正确初始化?或许它被其他一些代码踩到了。

也许您应该尝试在valgrind下运行测试并查看它是否有任何报告?

答案 4 :(得分:0)

0xdadadada对于有效指针来说听起来不太可能......很可能是调试初始值。

答案 5 :(得分:0)

具体来说,它是means you're accessing data that hasn't been initialized at all。问题 - 这是第一次尝试使用这种结构吗?

无论如何,请检查初始化代码;当你创建节点时,我打赌第一个节点,没有先前的节点,你没有设置它的值,但在上面的代码中你试图访问它。