指向void指针所需的显式转换

我有以下function签名

int foo(void **) 

并试图给它一个指向char指针的指针,即char ** 。 我的编译器抱怨以下警告

 argument of type "char **" is incompatible with parameter of type "void **" 

这是预期的吗? 我知道将一个char *传递给一个期望void *的函数void *不需要显式转换,但这对指针指针是否正确?

注意:这显然是一个C问题。 如果不同的C版本对此有不同的看法,我会感兴趣。

第22章:指针指针 :

关于指针和内存分配指针的一个观点:虽然malloc返回的void *类型是一个“generics指针”,适合分配给任何类型的指针,但假设类型void **不是“指向指针的通用指针“

因此,只有void *是一个通用指针。 void **不是通用指针。 因此,传递给函数的参数必须是void **类型。

另见C-FAQ

C中没有通用的指针指针类型void *仅作为通用指针使用,因为当其他指针类型分配给void *时会自动应用转换(如果需要); 如果尝试间接在指向void *之外的指针类型的void **值上,则无法执行这些转换。 当您使用void **指针值时(例如,当您使用*运算符访问void **指向的void *值时),编译器无法知道该void *值是否为一次从其他指针类型转换而来。 它必须假设它只不过是一个void * ; 它无法执行任何隐式转换。

换句话说,您使用的任何void **值必须是某个地方的实际void *值的地址; 类似于(void **)&dp ,虽然它们可能会关闭编译器,但它们是不可移植的(甚至可能没有你想做的事情;另见问题13.9)。 如果void **指向的指针不是void * ,并且如果它具有与void *不同的大小或表示,则编译器将无法正确访问它。