将 char** 类型的数组作为 void** 类型的参数传递会给出意外警告

Passing array of type char** as an argument of type void** gives unexpectable warning

在函数中将指针数组 (char**) 作为 void** 类型的参数传递时出现警告。

下面是我的代码。我使用 gcc 编译器,它给了我这个警告:

"warning: passing argument 1 of 'print' from incompatible pointer type [enabled by default]".

指向这一行print(lineptr, 2);

另一个警告说:

warning: format '%s' expects argument of type 'char *', but argument 2 has type 'void *'.

它指向这一行printf("%s\n", *v++);

我尝试用 char** 替换所有 void**,效果很好。

我想使用 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++);
}

问题是:这个警告会影响什么吗?

现在,我在 运行 代码和获得所需输出方面没有任何问题,但我想问一下是否保证这种方法每次都能正常工作。

提前致谢!

您可以将 char 数组转换为 void:

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

通常最好注意警告并修复问题以避免未定义的行为。

虽然您可以将 %s 用于当前的 lineptr,但您说您可以对 int 数组使用相同的函数。这会崩溃。此外,您当前的实现没有指定 int 数组的大小。我可能遗漏了什么。

你会如何定义你的 int 数组?您是对 int 数组的内容进行排序还是对整数数组进行排序,就像您当前对字符数组进行排序一样?