qsort на равном по размеру списке массивов символов в c - PullRequest
0 голосов
/ 05 мая 2018

У меня есть список массивов символов malloc ed следующим образом.

list= (char**)malloc(LIST_SIZE* sizeof(*list));
for (int i = 0; i < LIST_SIZE; i++)
    list[i] = (char*)malloc(sizeof(char) * 33);//33 is the size of each element in the list

Размер списка может увеличиваться до 25 000 (LIST_SIZE) или иногда может составлять всего 10 элементов или менее.

У меня есть функция compare () , которая выдает ошибки.

    int compare(const void * a, const void * b)
{
    const char **fpa = (const char**)a;
    const char **fpb = (const char**)b;
    return strcmp(*fpa, *fpb);
    //return *(char *)a - *(char*)b;//This one also does not work
}

qsort () вызывается следующим образом. Я подозреваю, что это терпит неудачу из-за способа, которым это вызвано, но я не мог понять почему.

qsort(list, current_list_element_count, 33, compare);

1 Ответ

0 голосов
/ 05 мая 2018

Вы передаете неправильное значение для размера элемента qsort.

Несмотря на то, что вы выделяете 33 байта для каждого массива, у вас фактически нет массива массивов. У вас есть массив указателей , каждый из которых указывает на массив.

Поскольку каждый элемент массива является char *, вы хотите передать его размер:

qsort(list, current_list_element_count, sizeof(char *), compare);

Или, в более общем смысле:

qsort(list, current_list_element_count, sizeof(*list), compare);

Таким образом, размер, который вы передаете, не зависит от типа.

...