首页  >  文章  >  后端开发  >  为什么在 C 中我不能将 `void*` 赋给非 Void 指针,但在 C 中却可以?

为什么在 C 中我不能将 `void*` 赋给非 Void 指针,但在 C 中却可以?

Patricia Arquette
Patricia Arquette原创
2024-10-31 11:22:29290浏览

  Why Can't I Assign a `void*` to a Non-Void Pointer in C  , But I Can in C?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn