typedef struct DNode{
int data;
struct DNode *lLink,*rLink;
} DblNode;
typedef DblNode * DblList;
void DestroyDblList(DblList L){
DblList head=L;
DblList p=head->rLink;
if(head->data){ //p->data is wrong?
while(p->data){
free(head);
head=p;
p=head->rLink;
}
free(head);
}
}
在包含评论的行中,当我使用if(p->data){
时,我的电脑会告诉我
分段错误(核心转储)
但是当我使用if(head->data){
时,就可以了。
它是如何发生的,原因是什么?
答案 0 :(得分:4)
在您的代码中p->data
与head->rLink->data
相同,其中head->rLink
未分配内存。因此,分段错误[作为undefined behavior的副作用。]。
另一方面,head->data
是完美的访问权限。
顺便说一句,您了解p->data
和head->data
相同 [在56
行],对吗?
答案 1 :(得分:1)
p->data
和head->data
相同,则 p
和head
会相同。在第56行中,如果第{55}行head
与head->rLink
相同,则只能为真,即head
指向自身,这与对双重链表的理解相矛盾。
因此p->data
和head->data
必须不同。
答案 2 :(得分:0)
您应该测试p
的无效性,而不是p->data
。