expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(char **)’
时间: 2024-08-16 13:06:55 浏览: 71
这个错误信息通常出现在C语言或者C++中,涉及到函数指针类型的不匹配。`void * (*)(void *)` 表示指向函数的指针,接受一个`void*`类型的参数并返回`void*`类型。而 `void * (*)(char **)` 则表示另一个函数指针类型,它接受的是`char**`类型的参数并返回`void*`。
当你试图将一个`void * (*)(char **)` 类型的函数指针赋值给需要`void * (*)(void *)` 类型的地方,编译器会报错,因为它无法将这两种不同的函数签名匹配起来。这可能是由于你在函数声明、传递参数或者函数指针变量初始化时搞错了类型。
修复这个问题,你需要确保传递给那个位置的函数指针与预期的函数签名匹配,即要么修改函数的实际类型使其兼容,要么改变函数指针的声明或使用。如果是在函数参数传递上出错,可以考虑更改传入参数的类型。
相关问题
报错expected ‘char **’ but argument is of type ‘char (*)[10]’
这个错误通常出现在函数参数类型声明不匹配的情况下。在这个问题中,`char (*)[10]` 表示一个指向长度为 10 的字符数组的指针,而 `char **` 表示一个指向字符指针的指针。因此,如果你将一个 `char (*)[10]` 类型的数组传递给期望 `char **` 类型的函数,就会出现上述错误。
解决这个问题的方法是将函数参数类型改为 `char (*str)[10]`,即指向长度为 10 的字符数组的指针。这样,就可以将 `str` 数组作为参数传递给函数了。同时,为了避免数组越界,你还需要将 `result` 数组的大小改为 `61`,即 `strlen("helloworldfoobarbazqux") + 1`。修改后的代码如下:
```c
void concatenate(char (*str)[10], int n, char *result, int pos) {
if (pos == n) {
result[pos] = '\0';
printf("%s\n", result);
return;
}
for (int i = 0; i < strlen(str[pos]); i++) {
result[pos + i] = str[pos][i];
}
concatenate(str, n, result, pos + strlen(str[pos]));
}
int main() {
char str[6][10] = {"hello", "world", "foo", "bar", "baz", "qux"};
char result[61];
concatenate(str, 6, result, 0);
return 0;
}
```
这个修改后的代码应该可以正常编译和运行了。
expected ‘const char *’ but argument is of type ‘char (*)[20]’
这个错误是由于参数类型不匹配导致的。函数期望接收一个`const char *`类型的参数,但实际传递的是一个`char (*)[20]`类型的参数。
`char (*)[20]`表示一个指向长度为20的字符数组的指针。而`const char *`表示一个指向字符常量的指针。
要解决这个错误,你需要确保传递给函数的参数类型与函数定义中的参数类型匹配。如果你想将`char (*)[20]`类型的参数转换为`const char *`类型,可以使用类型转换。
例如:
```c
void foo(const char *str) {
// 函数体
}
int main() {
char arr[20] = "Hello";
foo((const char *)arr); // 使用类型转换将参数类型转换为const char *
return 0;
}
```
在上面的例子中,我们使用了类型转换将`arr`的类型从`char (*)[20]`转换为`const char *`,然后将其作为参数传递给函数`foo`。这样就可以避免参数类型不匹配的错误。