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

时间:2014-08-06 13:26:08

标签: c pointers void-pointers

我有以下功能签名

int foo(void **)

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

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

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

注意:这明确是一个C问题。如果不同的C版本对此区别对待,我会感兴趣。

1 个答案:

答案 0 :(得分:0)

Chapter 22: Pointers to Pointers

  

关于指针和内存分配指针的一个观点:尽管void *返回的malloc类型是"泛型指针,"适用于指定或指向任何类型的指针,假设类型 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 *不同,那么编译器将无法执行正确访问它。