2017-01-11 6 views
0

Он должен сортироваться с объединением. Существуют две функции слияния и слияние сортировки. Некоторые неизвестные функции (чтение массива из файла и массива) полностью функциональны во входном файле.У меня ошибка сегментации, но я не нашел oO?

Valgrind покажите мне, что сбой происходит при распределении из массива2 и когда он читает и записывает на третьем этапе while-loop в void merge.

void merge(int* array, int start, int middle, int end) { 

    int size = end - start + 1; 
    int *array2 = malloc(size*sizeof(array2)); 

    int k = start; 
    int m = middle + 1; 
    int i = 0; 
    int j = 0; 

    while (k <= middle && m <= end) { 
     if (array[k] <= array[m]) { 
      array2[i] = array[k]; 
      k++;   
     } 
     else { 
      array2[i] = array[m]; 
      m++; 
     } 
     i++; 
    } 
    while (k <= middle) { 
     array2[i] = array[k]; 
     k++; 
     i++; 
    } 
    while (m <= end) { 
     array2[i] = array[k]; 
     k++; 
     i++; 
    } 
    while (j < i) { 
     array[ start + j -1 ] = array2[j]; 
     j++; 
    } 
    free(array2); 
} 

void merge_sort(int* array, int first, int last) { 

    int middle; 

    if (first < last) { 
     middle = ((first+last)/2); 
     merge_sort (array, first, middle); 
     merge_sort (array, middle + 1, last); 
     merge (array, first, middle, last); 
    } 
} 

int main (int argc, char *argv[]) 
{ 
    if (argc!=3) { 
      printf ("usage: %s <maximale anzahl> <dateipfad>\n", argv[0]); 
      exit(2); 
     } 

    char *filename = argv[2]; 

    int *array; 
    int size = atoi(argv[1]);  
    array = malloc(size*sizeof(array)); 

    int len = read_array_from_file(array, atoi(argv[1]), filename); 

    printf("Eingabe:\n"); 
    print_array(array, len); 

    merge_sort(array, array[0], len); 

    printf("Sortiert:\n"); 
    print_array(array, len); 

    free(array); 
    return 0; 
} 
+4

Пожалуйста, отлаживайте свой код шаг за шагом и возвращайтесь с более точным описанием проблемы. –

+0

1) 'array [start + j -1] = array2 [j]' -> 'array [start + j] = array2 [j]' – BLUEPIXY

+0

2) 'merge_sort (array, array [0], len); '->' merge_sort (array, 0, len-1); ' – BLUEPIXY

ответ

1

По крайней мере, это не так:

int *array2 = malloc(size*sizeof(array2)); 

Я думаю, что вы имеете в виду:

int *array2 = malloc(size * sizeof(*array2)); 

Вы хотите выделить size раз размер каждой записи, а не размер массива указатель.

Но (на 64-разрядной машине) это фактически сделает ваш массив равным половине байтов, в результате чего ваш перерасход произойдет раньше. У вас есть логическая ошибка, которую вам нужно выяснить, перейдя через ваш код с помощью отладчика.

+2

для массива 'array = malloc (size * sizeof (array));' => 'array = malloc (size * sizeof * array);' – Stargateur

 Смежные вопросы

  • Нет связанных вопросов^_^