尽管使用了等效语句,但出现细分错误的原因

时间:2019-02-22 15:12:28

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

我写了一个函数,用于在单链表上实现合并排序,其中每个元素都有一个整数和下一个指针。 函数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;

我无法理解其原因,因为这两组语句彼此相等

3 个答案:

答案 0 :(得分:9)

  

因为这两组语句彼此等效

他们绝对不是。

  1. 'The column of the last filled cell in the whole table lastCol = ws.Cells.Find(What:="*", _ After:=Range("A1"), _ LookAt:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious).Column 表示取消引用 *frontRef = source并在类型为{{1}的返回的 lvalue 表达式上调用frontRef }。

  2. operator=表示获取 node的地址,然后分配给frontRef = &source

    < / li>

如果source未初始化或为null,则(1)是未定义的行为,但是(2)可以。

答案 1 :(得分:9)

*frontRef = source; *backreef = f;

frontRef = &source; backreef = &f;

不相同:

enter image description here

一个正确地将frontback分配给两个链接列表,一个不正确,这会导致分段错误。

答案 2 :(得分:3)

  1. *frontRef = source; *backRef = f;
  2. frontRef = &source; backRef = &f;

这些不是等效的。

第二个只是使用另一个局部变量frontRef的地址更新了局部变量source,因此对于调用方而言,它实际上没有任何影响。您可能将frontRef设为out参数,但根本没有更新。 (与backRef相同。)