我有以下功能签名
int foo(void **)
我正试图给它一个指向char
指针的指针,即char **
。我的编译器抱怨以下警告
argument of type "char **" is incompatible with parameter of type "void **"
这是预期的吗?我知道将char *
传递给期望void *
的函数不需要显式转换,但对指针指针是否正确?
注意:这明确是一个C
问题。如果不同的C
版本对此区别对待,我会感兴趣。
答案 0 :(得分:0)
关于指针和内存分配指针的一个观点:尽管
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 *
不同,那么编译器将无法执行正确访问它。