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

时间:2019-01-03 20:04:36

标签: c eclipse sublimetext3

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

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

  

“警告:从不兼容的指针类型[默认启用]中传递'print'的参数1”。

它指向此行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 :(得分:2)

您可以将char数组强制转换为void

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

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

答案 1 :(得分:0)

虽然您可以在当前的lineptr中使用%s,但是您说您可以对int数组使用相同的函数。这会崩溃。另外,您当前的实现未指定int数组的大小。我可能会丢失一些东西。

您将如何定义int数组?您是要对int数组的内容进行排序还是对整数数组进行排序(与当前对字符数组进行排序一样)?