Причина ошибки сегментации, несмотря на использование эквивалентных операторов - PullRequest
0 голосов
/ 22 февраля 2019

Я написал функцию для реализации сортировки слиянием в односвязном списке, где каждый элемент имеет целое число и следующий указатель.Одна из функций 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 = source;* backRef = f;

заменены на

frontRef = & source;backRef = & f;

Я не могу понять причину этого, поскольку оба набора операторов эквивалентны друг другу

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019
  1. *frontRef = source; *backRef = f;
  2. frontRef = &source; backRef = &f;

Они не эквивалентны.

Второй просто обновляет локальную переменную frontRef другойадрес локальной переменной source, так что на самом деле это никак не влияет на сторону вызывающей стороны.Возможно, вы имели в виду frontRef как аргумент out, но он вообще не обновляется.(И то же самое для backRef.)

0 голосов
/ 22 февраля 2019
*frontRef = source; *backreef = f;

и

frontRef = &source; backreef = &f;

не эквивалентны:

enter image description here

Правильно назначаются front и back к двум связанным спискам, один - нет, что приводит к ошибке сегментации.

0 голосов
/ 22 февраля 2019

, так как оба набора операторов эквивалентны друг другу

Они абсолютно не являются.

  1. *frontRef = source означает разыменование frontRef и вызывает operator= для возвращенного lvalue выражения типа node.

  2. frontRef = &source означает, что принимает адрес source и и присваивает его frontRef.

Если frontRef неинициализирован или имеет значение NULL, (1) неопределенное поведение, но (2) хорошо.

...