Сортировка слиянием, динамическая память
Пишу сортировку слиянием для массива строк. В строке c[i] = malloc(sizeof(char*) + 1); предупреждение "Переполнение буфера". В c[i] хранятся адреса элементов a. Потом по адресу a[k] записывается адрес нужного элемента. Это неправильно? Подскажите, пожалуйста, как это исправить?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char** c;
void MergeSortRec(char* a[], int size)
{
int M, k = 0, i = 0, j;
if (size < 2)
return;
M = size / 2;
j = M;
MergeSortRec(a, M);
MergeSortRec(a + M, size - M);
for (k = 0; k < size; k++)
{
if (j >= size || i < M && strcmp(a[i], a[j]) < 0)
strcpy(c[k], &a[i++]);
else
strcpy(c[k], &a[j++]);
}
for (k = 0; k < size; k++)
strcpy(&a[k], c[k]);
}
void MergeSort(char* a[], int size)
{
c = malloc(sizeof(char*) * size);
if (c == NULL)
return;
for (int i = 0; i < size; i++)
{
c[i] = malloc(sizeof(char*) + 1);
if (c[i] == NULL)
{
for (int j = 0; j < i; j++)
free(c[j]);
free(c);
return;
}
}
printf_s("%zi\n", sizeof(c[0]));
MergeSortRec(a, size);
for (int i = 0; i < size; i++)
free(c[i]);
free(c);
}
int main()
{
char* arr[] = {"bananassssssssssssss", "apple", "oranges", "grapse", "sss", "xxxxx", "zzzzz", "aaaaaa", "qqqqq"};
int size = sizeof(arr) / sizeof(arr[0]);
MergeSort(arr, size);
for (int i = 0; i < size; i++)
printf("%s ", arr[i]);
return 0;
}