Передача массива типа char ** в качестве аргумента типа void ** дает неожиданное предупреждение - PullRequest
0 голосов
/ 03 января 2019

У меня есть предупреждение при передаче массива указателей (char **) в качестве аргумента типа void ** в функцию.

Ниже приведен мой код.Я использую компилятор gcc, он выдает мне следующее предупреждение:

"предупреждение: передача аргумента 1 'print' из несовместимого типа указателя [включено по умолчанию]".

Он указывает на эту строку print(lineptr, 2);

И еще одно предупреждение гласит:

предупреждение: формат "% s" ожидает аргумент типа "char *", но аргумент 2 имеет тип "void * '.

И он указывает на эту строку printf("%s\n", *v++);

Я попытался заменить все void** на char**, и это хорошо работает.

Причина, по которой я хочу использовать void**, заключается в том, что я пишу функцию быстрой сортировки, которая может принимать как символьные, так и целочисленные массивы.

#include <stdio.h>
char *lineptr[100] = {"mister", "x"};
void print(void **, int n);
int main()
{
    print(lineptr, 2);
    return 0;
}
void print(void **v, int n)
{
    while( n-- > 0 )
        printf("%s\n", *v++);
}

Вопрос в том, влияет ли это предупреждение на что-нибудь?

Теперь у меня нет проблем с запуском кода и получением желаемого результата, но я спрашиваю, гарантированно ли каждый раз будет работать этот метод.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Хотя вы можете использовать% s для текущего lineptr, вы говорите, что можете использовать ту же функцию для массивов int.Это потерпит крах.Кроме того, ваша текущая реализация не определяет размер массивов int.Я мог бы что-то упустить.

Как бы вы определили свой массив int?Будете ли вы сортировать содержимое массива int или массивы целых чисел так же, как вы в настоящее время сортируете массивы символов?

0 голосов
/ 03 января 2019

Вы можете преобразовать массив char в void:

print((void **)lineptr, 2);

Обычно лучше обращать внимание на предупреждения и исправлять ошибки, чтобы избежать неопределенного поведения.

...