Предположим, что у меня есть массив указателей на Char в C:Как выполнить qsort массив указателей на char в C?
char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };
И я хочу, чтобы отсортировать этот массив с помощью QSort:
qsort(data, 5, sizeof(char *), compare_function);
Я не могу придумать с функцией сравнения. По какой-то причине это не работает:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = (const char *)name1;
const char *name2_ = (const char *)name2;
return strcmp(name1_, name2_);
}
Я сделал много поиска и обнаружил, что я должен был использовать **
внутри QSort:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = *(const char **)name1;
const char *name2_ = *(const char **)name2;
return strcmp(name1_, name2_);
}
И это работает.
Может ли кто-нибудь объяснить использование *(const char **)name1
в этой функции? Я этого не понимаю. Почему двойной указатель? Почему моя оригинальная функция не работала?
Спасибо, Бода Cydo.
'data' должны быть объявлены' const'. –
Билли, если он const, он все еще может быть отсортирован? – bodacydo
Да. Массив может быть не 'const', но указатели, содержащиеся в этом массиве, должны быть' const'. Вам не разрешено изменять константные литералы времени компиляции (это неопределенное поведение для этого). Чтобы получить это, вам нужны данные 'const char * [5]'. Если вы хотите, чтобы массив тоже был постоянным, тогда вы будете использовать 'const char * const data [5]'. –