Печать значений типа void * - PullRequest
       11

Печать значений типа void *

1 голос
/ 22 сентября 2019

Ниже:

int cmp (void* x, void*y) {
    printf("x: %s | y: %s\n", (char*) x, (char*) y);
    return 0;
}

int main(int argc, char *argv[]) {
    char * strings[] = {"xml", "json"};
    qsort(strings, sizeof(strings), sizeof(strings[0]), cmp);
}

Как можно увидеть значения x, y?Нынешний подход приводит к таким бредам, как:

x: 2? | ??|у: 2? | ??

Ответы [ 2 ]

4 голосов
/ 22 сентября 2019

Прочитайте документацию qsort еще раз.Аргументы, передаваемые вашей функции сравнения, не являются объектами для сравнения, они указатели на эти объекты.Таким образом, x,y - это не сами строки (то есть указатели на символы строк), а указатели на эти указатели.

Таким образом, вы хотите написать

int cmp (void *x, void *y) {
    printf("x: %s | y: %s\n", *(char**) x, *(char**) y);
    return 0;
}

Также см. ДжошуаОтветьте о проблеме с аргументами размера в qsort.

Наконец, функция сравнения qsort должна принимать указатели на const void, а не просто void.И хорошей практикой будет сохранять вещи const, когда вы не собираетесь их изменять.В этом случае вы не собираетесь изменять указатель, на который указывает x, и символы, на которые указывает *x.Так что было бы еще лучше написать

int cmp (const void *x, const void *y) {
    printf("x: %s | y: %s\n", *(const char* const *) x, *(const char* const *) y);
    return 0;
}
3 голосов
/ 22 сентября 2019

sizeof(strings) не возвращает количество элементов в strings, а скорее что-то большее.Ваша программа не зависит.Вы хотите, чтобы sizeof(strings)/sizeof(strings[0]).

Хотя передача sizeof(argv[0]) для третьего аргумента сработала, вы действительно должны сказать sizeof(strings[0]), иначе ваш код будет трудно читать.

Причиной является бредqsort считывает вне диапазона массива strings и передает дикие указатели на cmp.Большая часть ерунды непечатна, поэтому вы получаете много?символы.

Нейт Элдридж поймал вторую половину.a и b аргументы cmp должны быть приведены к char **, а не char *.

...