传递给void **而不是void *会让编译器抱怨类型,为什么?

我不明白为什么编译器警告我在这段代码中传递一个不兼容的指针类型:(在这个上下文中void *void **之间的区别是什么)(我不知道这是否有所不同但我是使用gnu99 C版)

 void someFunc(void ** foo) { printf("%s\n", *foo); } int main() { char * text = "some text"; someFunc(&text); return 0; } 

而在这不是

 void someFunc(void * foo) { printf("%s\n", foo); } int main() { char * text = "some text"; someFunc(text); return 0; } 

提前致谢

void *是一种可以隐式转换为任何对象指针类型的类型。 void **不是 – 所以当你可以将一个char *分配给一个void * ,你不能char **void **做同样的事情。

原因是它们是不兼容的类型: char **指向char *void **指向void * ,因此它们的基类型不匹配。

要在第二个示例中修复代码,您可以执行以下操作之一:

 // Solution A, preferred: void someFunc(char * foo) { printf("%s\n", foo); } int main() { char * text = "some text"; someFunc(text); return 0; } 

在A中,您告诉编译器传递的参数是指向char的指针。 我没有尝试过解决方案B,应该工作,但为什么使用空隙,如果他们不是绝对必要的。

 // Solution B, should work but a purist might object: void someFunc(void * foo) { printf("%s\n", foo); } int main() { char * text = "some text"; someFunc( (void *) text); return 0; } 

在这个问题中没有明显的理由使用双ptr,所以你的第二个例子的解决方案A可能是要走的路。