Мое общее правило - преобразовать аргументы компаратора в локальные (указатели) переменные правильного типа, а затем использовать их в остальной части функции.Вы не можете индексировать void *
переменные в стандартном C, независимо от того, что говорит GCC.Размер void
, на который он указывает, не существует.
int cmp(const void *vp1, const void *vp2)
{
const char *s1 = *(char **)vp1;
const char *s2 = *(char **)vp2;
// Following your code - but it isn't very meaningful
printf("x: %c | y: %c\n", *s1, *s2);
printf("x: %s | y: %s\n", s1, s2);
size_t len = strlen(s1);
for (size_t i = 0; i < len; i++)
printf("x: %c | y: %c\n", s1[i], s2[i]);
return 0;
}
Это гораздо легче понять (и написать), чем использовавшиеся вами искажения.Существует даже умеренный шанс, что это «сработает», хотя, поскольку все элементы сравниваются одинаково, данные не будут отсортированы каким-либо значимым образом (одна из причин комментария в коде).
Предупреждение: Перед публикацией этого ответа не было консультации с компилятором.