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

问题描述 投票:0回答:2

在函数中将指针数组 (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++);
}

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

现在,我运行代码并获得所需的输出没有任何问题,但我想知道这个方法是否每次都保证运行良好。

c eclipse sublimetext3
2个回答
2
投票

您可以将

char
数组转换为
void
:

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.