Сортировка слиянием, динамическая память

Пишу сортировку слиянием для массива строк. В строке 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;
}

Ответы (0 шт):