为什么char**(或任何T**)无效**无效?

eud*_*xos 3 c c++ pointers casting

在对Python C模块的第一条评论中--Malloc 在特定版本的Python中失败,@ user694733提到转换char**void**无效.我读了从Foo**到void**的无效转换 - 为什么隐式类型转换允许void*但不是void**?http://c-faq.com/ptrs/genericpp.html但是有一个标准的引用,但没有真正的例子,在这种情况下,这可能是不正确的,导致错误.例如思考void**double**,反之亦然,有没有在那里可以出错的情况下?为什么(从技术上讲,不仅仅因为它是UB)?

Dav*_*eas 11

如果允许,它将在类型系统中创建一个循环孔:

T* ptr;
void **vptr = &ptr; // &ptr is of type T**
int value;
*vptr = &value;     // &value is int*, can be converted to void*
Run Code Online (Sandbox Code Playgroud)

此时,ptr根据类型系统指向的指针T,指向的value是一个int.虽然该语言允许您绕过类型系统,但您必须明确请求它.隐式转换旨在避免此类问题.