Ошибка сегментации (дамп ядра) в C в сортировке слиянием с использованием указателей и связанных списков - PullRequest
0 голосов
/ 10 октября 2018

У меня проблемы с выяснением, какая строка кода вызывает ошибку ошибки сегментации (сбрасывается ядро) в моем коде.Я пытаюсь реализовать сортировку с использованием связанных списков (с указателями).то есть решение на месте, где хвостовые указатели изменены, чтобы указывать на что-то новое.

Я попытался использовать gdb для отладки и сказать мне, какая строка вызвала ошибку сегментации, но он только сообщает мне адрес, который я не могуне думаю, что это полезно.

Это функция слияния:

    List *mergesort(List *list) { 
  if (list == NULL || list->tail == NULL) { 
    return list;
  } else { 
    List *list1;
    List *list2;
    split(list, &list1, &list2);
    list1 = mergesort(list1);
    list2 = mergesort(list2);
    return merge(list1, list2);
  }
}

Ошибка возникает в функции split:

void split(List *list, List **list1, List **list2) { 
  /* TODO */
  printf("split is called\n");
  List * pointer_list1;
  List * pointer_list2;
  List * pointer_traverse1;
  List * pointer_traverse2;
  printf("start");
  pointer_list1 = list;
  pointer_list2 = list->tail;
  list = list->tail;
  int sentinel = 0;
  while(list->tail != NULL){
    printf("entering while loop");
    if(sentinel == 0){
      printf("sentinel equals zero");
      pointer_traverse1->tail = list->tail;
      pointer_traverse1 = pointer_traverse1->tail;
      printf("end of if block");
    }else{
      pointer_traverse2->tail = list->tail;
      pointer_traverse2 = pointer_traverse2->tail;
    }
    list = list->tail;
    if(sentinel == 0 ){
      sentinel = 1;
    }else{
      sentinel = 0;
    }
  }
  printf("END");
  list1 = &(pointer_list1);
  list2 = &(pointer_list2);
  return;
}

Обратите внимание, что вызывается только первый оператор printf ("split")") называется.Функция слияния никогда не вызывается до возникновения ошибки.Никакой другой printf в функции split не запускается.Так что мое естественное предположение состоит в том, что создание этих указателей на списки приводило к ошибке сегментации, но это смешно, потому что они просто декларации?Возможно ли, что у меня закончилась какая-то память?

// Это может быть полезно для любого, кто пытается понять разделение.По сути, учитывая список целых чисел, скажем [1,2,3,4,5,6], я пытаюсь создать список1 из [1,3,5] и список2 из [2,4,6].Я делаю это, создавая указатель для list1, другого list2, и перебирая список, перебрасывая числа поочередно в list1 и list2.

...