The merge sort is written by myself

Code:

#include <stdio.h>
#include <stdlib.h>
void merge(int *a, int p, int q, int r)
{
int n1 = q-p+1;
int n2 = r-q;
int *L = (int*)malloc((n1+1)*sizeof(int));
int *R = (int*)malloc((n2+1)*sizeof(int));
int i, j, k;
for (i = 0; i < n1; i++)
L[i] = a[p+i];
for (j = 0; j < n2; j++)
R[j] = a[q+j];
L[n1+1] = -1;
R[n2+1] = -1;
i = 0;
j = 0;
for (k = p; k < r; k++)
if (L[i] <= R[j]) {
a[k] = L[i];
i++;
}
else {
a[k] = R[j];
j++;
}
free(L);
free(R);
}
void merge_sort(int *a, int p, int r)
{
if (p < r) {
int q = (int)((p+r)/2);
merge_sort(a, p, q);
printf("asdfasd\n");
merge_sort(a, q+1, r);
printf("haha\n");
merge(a, p, q, r);
}
}
int main()
{
int i, n;
int *a;
printf("n = ");
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
merge_sort(a, 0, n-1);
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}

Why doesn't this code work fine? Which step do i make wrong?