我有以下函数签名
int foo(void **)
我试图给它一个指向char
指针,即char **
。我的编译器抱怨以下警告
argument of type "char **" is incompatible with parameter of type "void **"
这是可以预料的吗?我知道通过char *
到一个期望的函数void *
不需要显式强制转换,但是对于指向指针的指针来说是这样吗?
注意:这显然是一个C
问题。如果不同我会感兴趣C
版本对此的处理方式有所不同。
第22章:指向指针的指针:
关于指向指针和内存分配的一方面:虽然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 *
,那么编译器将无法正确访问它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)