Использование этого исходного кода:
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH_LINE 50
typedef struct Person
{
char name[MAX_LENGTH_LINE];
long id;
float age;
} Person;
void merge(Person **arr[], int firstElement, int midElement, int lastElement)
{
int firstHalfSize = midElement - firstElement + 1;
int secondHalfSize = lastElement - midElement;
Person *firstHalfArray[firstHalfSize];
Person *secondHalfArray[secondHalfSize];
//char *p;
//char *s;
for (int i = 0; i < firstHalfSize; i++)
{
firstHalfArray[i] = *arr[firstElement + i];
}
for (int j = 0; j < secondHalfSize; j++)
{
secondHalfArray[j] = *arr[midElement + 1+ j];
}
int index1 = 0;
int index2 = 0;
int mergedArrIndex = firstElement;
while (index1 < firstHalfSize && index2 < secondHalfSize)
{
if ((*firstHalfArray)[index1].id <= (*secondHalfArray)[index2].id)
{
arr[mergedArrIndex] = &firstHalfArray[index1];
index1++;
}
else
{
arr[mergedArrIndex] = &secondHalfArray[index2];
index2++;
}
mergedArrIndex++;
}
while (index1 < firstHalfSize)
{
arr[mergedArrIndex] = &firstHalfArray[index1];
mergedArrIndex++;
index1++;
}
while(index2 < secondHalfSize)
{
arr[mergedArrIndex] = &secondHalfArray[index2];
mergedArrIndex++;
index2++;
}
}
void mergeSort(Person **arr, int firstElement, int lastElement)
{
if (firstElement < lastElement)
{
int midElement = (firstElement + lastElement) / 2;
mergeSort(arr, firstElement, midElement);
mergeSort(arr, midElement + 1, lastElement);
merge(&arr, firstElement, midElement, lastElement);
}
}
int main( void )
{
Person *arrPersons;
arrPersons = malloc( sizeof( Person ) * 20 );
mergeSort(&arrPersons, 0, 19);
}
Ниже приведены результаты выполнения программы через gdb
gdb untitled2
....
(gdb) br main
Breakpoint 1 at 0xa3b: file untitled2.c, line 87.
(gdb) r
Starting program: untitled2
Breakpoint 1, main () at untitled2.c:87
87 {
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x0000555555554827 in merge (arr=0x7fffffffde88, firstElement=0, midElement=0,
lastElement=1) at untitled2.c:33
33 secondHalfArray[j] = *arr[midElement + 1+ j];
(gdb) bt
#0 0x0000555555554827 in merge (arr=0x7fffffffde88, firstElement=0,
midElement=0, lastElement=1) at untitled2.c:33
#1 0x0000555555554a30 in mergeSort (arr=0x7fffffffdf70, firstElement=0,
lastElement=1) at untitled2.c:79
#2 0x0000555555554a04 in mergeSort (arr=0x7fffffffdf70, firstElement=0,
lastElement=2) at untitled2.c:77
#3 0x0000555555554a04 in mergeSort (arr=0x7fffffffdf70, firstElement=0,
lastElement=4) at untitled2.c:77
#4 0x0000555555554a04 in mergeSort (arr=0x7fffffffdf70, firstElement=0,
lastElement=9) at untitled2.c:77
#5 0x0000555555554a04 in mergeSort (arr=0x7fffffffdf70, firstElement=0,
lastElement=19) at untitled2.c:77
#6 0x0000555555554a6e in main () at untitled2.c:91
(gdb)
line 77 mergeSort(arr, firstElement, midElement);
Line 79 merge(&arr, firstElement, midElement, lastElement);
Line 33 secondHalfArray[j] = *arr[midElement + 1+ j];
Where
j = 0
Вышеупомянутое должно быть всем, что вам нужно знать, чтобы исправить программа.
Примечание: я не давал полям массива Person
каких-либо определенных c значений.
советую прочитать: сортировка слиянием
Следует отметить, что **
не используется при передаче параметров