将 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 数组的内容进行排序还是对整数数组进行排序,就像您当前对字符数组进行排序一样?
在函数中将指针数组 (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 数组的内容进行排序还是对整数数组进行排序,就像您当前对字符数组进行排序一样?