找回密码
立即注册
搜索
发回帖 发新帖

6585

积分

0

好友

806

主题
发表于 昨天 19:06 | 查看: 1| 回复: 0

这篇文章主要聊三件事:

  • Option 和空指针,本质没有区别
  • C 的空指针,其实是个“假概念”
  • 移除 NULL?你自己造一个就行

很多人把 NULL 称为“计算机科学中最糟糕的错误”,理由确实很充分。但每当有人问出那个经典问题——“如果没有空指针,C 语言里的树和链表这些数据结构还怎么工作?”——恕我直言,这种说法纯属胡扯。

Option 和空指针,本质没有区别

先看一个容易被神话的对比:Rust 里的 Option 类型和 C 语言里的空指针,有什么本质区别吗?并没有。NULL 相当于 None,其他值相当于 Some。两者在语义上是一一对应的:要么有值,要么没有值。

然而,这两种语言之间确实存在一个惊人的差异,那就是所有权追踪(ownership tracking)。C 语言恰恰缺了这个。正因如此,C 语言里会出现一种悬空指针(dangling pointer):它虽然非空,但指向的内存已经无效了。解引用这种指针和解引用空指针的后果一模一样:程序崩溃。

更糟糕的是,空指针可以通过代码检查出来;但悬空指针在外观上和有效指针没有任何区别,程序根本无法区分它们。这才是真正的问题所在。

C 的空指针,其实是个“假概念”

C 语言空指针实现的另一个问题在于:它根本就没有真正的“空指针”概念。

在 Rust 中,如果你试图对一个包含 None 的 Option 执行 unwrap(),运行时会直接触发 panic。但在 C 语言里,这种检查不是自动的,你必须手动去判断指针是否为空。如果你尝试解引用一个空指针(或者任何无效指针),C 语言本身并不会拦截这种非法访问。硬件可能会抛出异常,也可能不会——完全取决于你的运气。

其实,实现真正的空指针在技术上是可行的,但如果没有所有权追踪机制,这种实现也就失去了意义。

移除 NULL?你自己造一个就行

最后,让我们来回答最初的那个问题:假设我们从 C 语言中移除了空指针,那会怎样?

很简单,你自己造一个就是了。你可以给它起个别的名字,比如 INVALID 或者 Empty。至于它的值,你可以选任何永远不会合法的地址。选 0 很实用,因为在汇编层面很容易检查;但选其他数字也行。比如 0xFFFFFFFF 就很容易检查,这也是微软选用的 INVALID_HANDLE_VALUE 的值——它本质上就是 WinApi 里的“空指针”。

如果规则是“指针必须始终指向有效对象”,那我们完全可以专门创建一个有效对象,唯一的目的就是用来标记指针处于“无效”状态。

我们要明白一个重要的概念:在 C 语言中,空指针并不是语言本身的一部分,它们只是标准库和大多数应用程序中广泛使用的一种软件约定而已。NULL 不过是定义在标准头文件里的一个宏。你完全可以为自己的程序制定一套不同的约定,C 语言编译器根本不在乎。

所以,NULL 从来不是 C 语言的“设计缺陷”,它只是一个约定。真正缺失的,是那套能让你区分“有效”与“无效”的所有权追踪机制。骂 NULL 很容易,但骂完之后,悬空指针还在那里——这才是值得每个 C 程序员认真面对的问题。




上一篇:AI推理芯片该怎么设计?7条原则讲透低精度与访存瓶颈
下一篇:身处AI迷局,聊聊为什么、做什么、该往何处去
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-11-11 16:46 , Processed in 0.063026 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表