尽管使用等效语句,但分段错误的原因

vir*_*007 2 c++ pointers segmentation-fault c++11 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;
}
Run Code Online (Sandbox Code Playgroud)

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

*frontRef = source;*backRef = f;

被替换为

frontRef =&source; backRef =&f;

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

Vit*_*meo 9

因为这两组陈述彼此相同

他们绝对不是.

  1. *frontRef = source表示取消引用 frontRef并调用operator=返回的类型的左值表达式node.

  2. frontRef = &source意思是取地址 source并分配给它frontRef.

如果frontRef未初始化或为null,则(1)是未定义的行为,但(2)没问题.


小智 9

*frontRef = source; *backreef = f;
Run Code Online (Sandbox Code Playgroud)

和

frontRef = &source; backreef = &f;
Run Code Online (Sandbox Code Playgroud)

不等同于:

在此输入图像描述

一个正确分配front和back两个链接列表,一个没有,这导致分段错误.