【问题标题】:Why I can not use "p->data" instead of "head->data" in C?为什么我不能在 C 中使用“p->data”而不是“head->data”?
【发布时间】:2014-11-27 14:40:42
【问题描述】:
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);
    }
}

在与cmets的行中,当我使用if(p->data){时,我的电脑告诉我

分段错误(核心转储)

但是当我使用if(head->data){ 时就可以了。

这是怎么发生的,是什么原因造成的?

【问题讨论】:

  • phead 是不同的指针。为什么你期望他们有同样的行为?

标签: c pointers dereference


【解决方案1】:

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

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

顺便说一句,你知道p->datahead->data 不是相同 [在56 行],对吧?

【讨论】:

    【解决方案2】:

    如果phead 相同,则p->datahead->data 将相同。在第 56 行,这只有在 head 与第 55 行的 head->rLink 相同时才成立,即 head 指向自身,这与对双链表的理解相矛盾。

    所以p->datahead->data 必须不同。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我也想过这个,得出的结论是,在某些情况下p->data 是正确的。除此之外,这并不能回答恕我直言的问题。
      猜你喜欢
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多