为什么我不能在C中使用“p-> data”而不是“head-> data”?

时间:2014-11-27 14:40:43

标签: c pointers dereference

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){时,就可以了。

它是如何发生的,原因是什么?

3 个答案:

答案 0 :(得分:4)

在您的代码中p->datahead->rLink->data相同,其中head->rLink未分配内存。因此,分段错误[作为undefined behavior的副作用。]。

另一方面,head->data是完美的访问权限。

顺便说一句,您了解p->datahead->data 相同 [在56行],对吗?

答案 1 :(得分:1)

如果p->datahead->data相同,则

phead会相同。在第56行中,如果第{55}行headhead->rLink相同,则只能为真,即head指向自身,这与对双重链表的理解相矛盾。

因此p->datahead->data必须不同。

答案 2 :(得分:0)

您应该测试p的无效性,而不是p->data