指向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 *
不同的大小或表示,则编译器将无法正确访问它。