Может ли кто-нибудь объяснить, почему следующий раздел кода привел к ошибке с ошибкой сегментации (с явным сбросом)? Я уверен, что у меня странный указатель или что-то еще; однако я не могу его найти. Любая помощь будет оценена по достоинству. Я пытаюсь создать функцию MergeSort.Ошибка сегментации - Сброс сердечника в функции MergeSort
int* mergesort(int* num, int n)
{
int *left, *right;
int middle = n/2;
if (n <= 1)
return num;
//split array into two halves each with elements of 0...middle-1 and middle...n-1 correspondingly
split(num, n, &left, &right, middle);
left = mergesort(left, middle);
right = mergesort(right, n-middle);
merge(num, left, right, middle, n-middle);
free(left);
free(right);
return num;
}
void split(int* num, int n, int** left, int** right, int middle)
{
left = #
right = &num + middle;
}
int* merge (int* num, int* left, int* right, int sizeLeft, int sizeRight)
{
int i, j, k, n;
i = j = k = 0;
n = sizeLeft + sizeRight;
while (k < n)
{
if (i < sizeLeft)
{
if (j < sizeRight)
{
insert(num, left, right, &i, &j, &k);
}
else
{
append(num, left, sizeLeft, &i, &k);
}
}
else
{
append (num, right, sizeRight, &j, &k);
}
}
}
void insert(int* num, int* left, int* right, int* i, int* j, int*k)
{
if (left[*i] < right[*j])
{
num[*k] = left[*i];
(*i)++;
}
else
{
num[*k] = right[*j];
(*j)++;
}
(*k)++;
}
void append(int* num, int* half, int sizeHalf, int* i, int* k)
{
while (*i < sizeHalf)
{
num[*k] = half[*i];
(*i)++; (*k)++;
}
}
Время узнать, как использовать отладчик. Определите, где произошел сбой, затем работайте назад, чтобы понять, как ваша программа переходит в недопустимое состояние. –
Обзор кода - это не то, как вы находите ошибки при сбое. Запустите его в отладчике, и отладчик скажет вам, какая строка кода вызывает сбой. –
Вот хороший трюк: выделите память в том же месте, где вы ее освободите. Ваш код освобождает вспомогательные массивы 'left' и' right', но он никогда не выделял их. – chqrlie