当我们处理前一个或下一个为空的指针时,我正在使用一个双链表并获得有关边缘情况的奇怪性能。 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;
为什么会出现分段错误?
答案 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。问题 - 这是第一次尝试使用这种结构吗?
无论如何,请检查初始化代码;当你创建节点时,我打赌第一个节点,没有先前的节点,你没有设置它的值,但在上面的代码中你试图访问它。