C 字符串:一个 50 年的错误
来源:longtran2904.substack.com — 2026-07-16
📋 概述
本文直言 C 语言的 null 终止字符串是半个世纪的错误设计。作者追溯了从 PDP-11 时代的 ASCIZ 指令到现代 C 标准的历史,指出 NUL 终止的设计导致了 缓冲区溢出、O(n) 的长度计算、无法安全存储二进制数据、以及无数安全漏洞。作者认为 Pascal 风格的 长度前缀字符串远优于 C 方案,而 C++ 的 std::string 和 Rust 的 &str 正是对这种错误的历史修正。
🔑 核心要点
- null 终止的三大缺陷:O(n) 的 strlen、无法存储 NUL 字符、缓冲区溢出的根源
- 历史的偶然性:PDP-11 的 ASCIZ 指令恰好方便了 NUL 终止,而非深思熟虑的设计选择
- 长度前缀是正确答案:Pascal、Go、Rust 都用长度前缀 + 数据,C 是唯一坚持 null 终止的主流语言
- 安全代价巨大:CVE 数据库中与缓冲区溢出相关的漏洞,大量可追溯到 null 终止字符串的误用
💡 金句
C strings are a 50-year mistake — null termination has cost billions in security vulnerabilities and developer hours.
← 返回 Lobsters 首页