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

时间:2015-04-30 21:58:30

标签: c++ c pointers casting

Python C Module - Malloc fails in specific version of Python的第一条评论中,@ user694733提到将char**投射到void**无效。我读过Invalid conversion from Foo** to void** - why is implicit type conversion allowed to void* but not to void**?http://c-faq.com/ptrs/genericpp.html但是有一个标准的引用,但没有真正的例子,在这种情况下,这可能是不正确的,导致错误。考虑例如void**double**,反之亦然,是否有可能出错的情况?为什么(从技术上讲,不只是因为它是UB)?

2 个答案:

答案 0 :(得分:1)

最大的实际问题是多重继承。当您使用指向具有多个基类的类的指针时,指针的实际值将取决于指针的类型,并且当您从一个指针类型分配给另一个指针类型时,编译器会插入修正代码来调整它。当你有一个指向指针的指针时,编译器不再有机会进行这些修正,因此标准不允许该操作。

答案 1 :(得分:1)

  

但有一个标准的引用,但没有真实的例子,在这种情况下,这可能是不正确的,导致错误

这不准确。您提到的网页http://c-faq.com/ptrs/genericpp.html指向另一个网页http://c-faq.com/null/machexamp.html,其中包含不同类型的指针大小不同的计算机示例:

  

Data General的Eclipse MV系列有三种架构支持的指针格式(字,字和位指针),其中两个由C编译器使用:char *和void *的字节指针,以及其他所有字的指针。由于历史原因在从16位Nova线演变32位MV线期间,字指针和字节指针在字中的不同位置具有偏移,间接和环保护位。将不匹配的指针格式传递给函数会导致保护错误。最终,MV C编译器添加了许多兼容性选项,以尝试处理具有指针类型不匹配错误的代码。