悬空指针和 void 指针的区别

2025 年 1 月 7 日 | 阅读 3 分钟

在本文中,我们将讨论 C 语言中的悬空指针Void 指针。但在讨论它们的区别之前,我们必须了解 C 语言中的悬空指针和 Void 指针。

什么是悬空指针?

悬空指针是程序内存中指向已被释放或删除的位置(应用程序当前未使用的内存)的指针。在处理内存块的分配和释放时,会看到动态内存分配的概念。在 C 编程中,通常使用 Malloc()、calloc()free() 函数来动态分配和释放内存块。当我们使用 free() 方法释放内存块时,就会创建一个悬空指针。

如果更改此指针的值,操作系统指令或程序代码的值将被覆盖;在这些情况下,程序可能会崩溃或显示不同的结果。如果我们解引用悬空指针,并且内存被重新分配给另一个进程,将会发生 段错误

如何避免悬空指针错误

可以通过将指针初始化为 NULL 来避免悬空指针问题。如果我们为指针提供 NULL 值,它将不会指向已释放的内存。当指针被赋值为 NULL 值时,表示该指针不指向任何内存地址。

什么是 Void 指针?

没有与之关联数据类型的指针称为 void 指针。顾名思义,void 指针表示该指针基本上是空的;因此,它可以存储任何程序数据类型的地址。之后,这些包含地址的 void 指针可以轻松地转换为各种数据类型。

此类 void 指针还可以使内存分配相对容易。因为它们为函数提供了足够的灵活性,可以正确地分配字节和内存。

语法

它具有以下语法:

在这种情况下,指针类型是 void 关键字,后面跟着 指针名称,它标识了地址在代码中的位置并指向指针类型。当声明一个指针时,它包含其类型和名称,并接受任何提供的数据类型。让我们举个例子来理解这一点。

示例

在这种情况下,指针期望一个 void 类型,而不是 int、float 或其他类型。在此实例中,pt 指针包含 * 符号。它表示此指针的声明。

优点

  • Malloc()calloc() 返回 void* 类型,这允许它们分配任何数据类型的内存。
  • 这些指针用于构建通用函数。

悬空指针和 Void 指针之间的主要区别

Difference between a Dangling pointer and a Void pointer

悬空指针和 Void 指针之间存在一些区别。这些指针之间的一些主要区别如下

方面悬空指针void 指针
定义悬空指针是指向已被释放的内存区域的指针,这会导致访问时出现未定义的行为。void 指针是指没有关联数据类型的指针,用于保存任何数据类型的地址。
原因当指针指向已被释放或回收的内存位置时产生。设计用于保存任何数据类型的地址。
目的它通常发生在释放内存后,或者当指针在其持续被引用的作用域之外时。它用于开发通用函数或动态管理内存而不定义数据类型。
风险如果解引用或在释放后使用它,它可能导致软件崩溃、异常活动或安全漏洞。使用 void 指针 (void*) 的主要风险是,由于缺乏特定的数据类型,它们可能导致与类型相关的错误。
预防通过在释放后将引用设置为 NULL,可以帮助防止意外使用。避免在释放后使用指针。需要显式类型转换才能访问 void 指针指向的数据。
示例指针 ptr 指向由 free(ptr) 方法释放的内存。在 free(ptr) 后使用 ptr 会产生悬空指针。void *ptr; 是一个 void 指针,它可以保存任何数据类型的地址。例如,ptr = &integer; 或 ptr = &character; 保存整数或字符类型的地址。