Hi,
I'm writing a program that separates a set of integers into groups and
then quicksort each group individually. However, I'm having problems
with my realloc() function.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10 // number of integers to sort
#define size 2 // number of groups
#define MAX 100 // maximum value of the integers
void quicksort(int a[], int lo, int hi)
{
int h, l, p, t;
if (lo < hi)
{
l = lo;
h = hi;
p = a[hi];
do {
while ((l < h) && (a[l] <= p))
l = l+1;
while ((h > l) && (a[h] >= p))
h = h-1;
if (l < h)
{
t = a[l];
a[l] = a[h];
a[h] = t;
}
} while (l < h);
t = a[l];
a[l] = a[hi];
a[hi] = t;
quicksort(a, lo, l-1);
quicksort(a, l+1, hi);
}
}
int main()
{
int i, j, *length, x[N], **a, *temp;
srand(time(NULL));
a = (int **)malloc(size * sizeof(int*));
for (i = 0 ; i < size ; i++)
a[i] = (int*)malloc((N/size + 1) * sizeof(int));
length = (int *)malloc(size * sizeof(int));
/* Generate random integers */
printf("Original: \n");
for (i = 0 ; i < N ; i++)
{
x[i] = rand() % MAX;
printf("%d ", x[i]);
}
printf("\n\n");
for (j = 0 ; j < N ; j++)
{
for (i = size ; i >= 1 ; i--)
{
if ((double)x[j]/(double)MAX > (double)(i-1)/(double)size)
{
a[i-1][length[i-1]] = x[j];
length[i-1]++;
if (length[i-1] > N/size + 1)
{
if ((temp = realloc(a[i-1], sizeof(int) * 2 * (N/size + 1)))
== NULL)
{
printf("ERROR: realloc failed");
exit(0);
}
a[i-1] = temp;
}
break;
}
}
}
for(i = 0 ; i < size ; i++)
quicksort(a[i],0,length[i]-1);
printf("Sorted:\n");
for(i = 0 ; i < size ; i++)
{
for (j = 0 ; j < length[i] ; j++)
printf("%d ", a[i][j]);
}
printf("\n");
for (i = 0 ; i < length[i] ; i++)
free(a[i]);
free(a);
free(length);
return 0;
}
Everytime the realloc() function is needed, i.e. when the size of any
of the 2 groups has to be increased to more than the original 6
integers, I'll either get the error "Segmentation Fault", "*** glibc
detected *** realloc(): invalid next size: 0x00000000005020c0 ***", or
the value that's supposed to go into the newly created memory, e.g.
a[0][6], becomes 0.
How do I fix this problem?
Thank you.
Regards,
Rayne