void 指针:揭示 C 和 C 之间的鸿沟
当谈到 void 指针时,C 和 C 表现出不同的行为。问题围绕着将 void* 返回值分配给非 void 指针的允许性展开。
在 C 中,允许进行此类分配,如以下编译无错误的代码所示:
<code class="c">int* p = malloc(sizeof(int));</code>
然而,在 C 中,相同的代码无法编译,这凸显了 C 中更严格的类型检查。这种差异源于 void 指针处理方式的差异。
虽然 C 允许 void 和任何其他指针类型之间的隐式转换,但 C 限制了这种自由。在 C 中,从 void 到特定指针类型的转换需要显式强制转换。因此,要在 C 中编译以下代码,需要进行强制转换:
<code class="c++">int* p = (int*) malloc(sizeof(int));</code>
尽管存在这种差异,C 确实允许从非 void 指针到 void* 的隐式转换。这个特性在下面的代码中很明显:
<code class="cpp">void foo(void* vptr) { } int main() { int* p = (int*) malloc(sizeof(int)); foo(p); return 0; }</code>
这段代码在 C 和 C 语言中编译都没有问题。原因在于 void 固有的灵活性和指针的本质。任何对象指针都可以安全地转换为 void 而不会丢失信息。当 void* 转换回其原始指针类型时,将恢复精确的指针。 K&R2 的引用说明了这一点:
“任何指向对象的指针都可以转换为 void * 类型,而不会丢失信息。如果结果转换回原始指针类型,则恢复原始指针.”
以上是为什么在 C 中我不能将 `void*` 赋给非 Void 指针,但在 C 中却可以?的详细内容。更多信息请关注PHP中文网其他相关文章!