【问题标题】:Reason for segmentation fault despite using equivalent statements尽管使用了等效语句,但出现分段错误的原因
【发布时间】:2019-07-16 17:19:36
【问题描述】:

我写了一个在单链表上实现归并排序的函数,其中每个元素都有一个整数和一个 next 指针。 其中一个函数 splitlist 用于将给定的链表拆分为两个链表

void splitList(struct node* source, struct node** frontRef, struct node** backRef)
{
    struct node *s, *f;
    s = source;
    f = s->next;
    while(f && f->next)
    {
        s = s->next;
        f = f->next->next;
    }
    *frontRef = source;
    f = s->next;
    s->next = NULL;
    *backRef = f;
}

这里的source是一个指向给定链表的指针,frontRef和backRef是对需要通过这个函数分配的指针的引用。 fronRef 应该引用第一个链表,而 backreef 应该引用第二个链表。 此代码在行时会出现分段错误

*frontRef = 来源; *backRef = f;

被替换为

frontRef = &source; backRef = &f;

我不明白这是什么原因,因为这两组陈述彼此等价

【问题讨论】:

  • @user200783 这有什么关系?
  • sourcef 是局部变量,保持对它们的引用不会很好地工作
  • '两个语句是等价的'。显然他们不是。使用指针时,您必须牢记复制指针和复制所指向的内容之间的区别。
  • @user200783 这是我在发布之前删除的一些调试语句的一部分。我现在删除了它。

标签: c++ c++11 pointers segmentation-fault c++14


【解决方案1】:
*frontRef = source; *backreef = f;

frontRef = &source; backreef = &f;

不等价:

一个正确地将frontback分配给两个链表,一个没有,导致分段错误。

【讨论】:

    【解决方案2】:

    因为这两组陈述彼此等价

    他们绝对不是。

    1. *frontRef = source 表示 dereference frontRef 并在返回的 node 类型的 lvalue 表达式上调用 operator=

      李>
    2. frontRef = &source 表示source的地址,分配frontRef

    如果 frontRef 未初始化或为 null,则 (1) 是未定义的行为,但 (2) 很好。

    【讨论】:

    • 但是在(2)的情况下发生了故障。
    【解决方案3】:
    1. *frontRef = source; *backRef = f;
    2. frontRef = &source; backRef = &f;

    这些不是等价的。

    第二个只是用另一个局部变量source的地址更新局部变量frontRef,所以它实际上对调用方没有任何影响。您可能的意思是 frontRef 是一个输出参数,但它根本没有更新。 (backRef 也一样。)

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2018-12-08
      • 2014-11-18
      • 2011-10-22
      相关资源
      最近更新 更多