null - 没有NULL的类C语言?

标签 null computer-science language-design nullable

嗨我最近在看一个旧的video关于空指针如何成为十亿美元的错误。他指出 C# 和 java 都有运行时检查,但没有完全消除它,这在某种程度上是可以理解的。他还指出了一个他认为非常确定的 C 是一个大问题。我得到了以空结尾的字符串,没有长度的数组和其他一些东西是不好的(数十亿美元的缓冲区溢出漏洞),但是要完全删除空?

一些语言已经使 null 成为过去,而其他语言试图替代 C,但我找不到哪种语言同时完成了这两者。

如果 C 的 null 如此糟糕,那么为什么没有人创建它的替代品?即 Haskell 很好,但不能作为替代品运行。

最佳答案

不被替换是有原因的,这样看,C程序库如此庞大,代码成千上万,创建替换会像代码一样引起很多悲痛要更新以反射(reflect)更改,如 NULL在指针的上下文中意味着调用将失败并因此返回 NULL表示处理指针的代码失败的情况。此外,它用于 FILE * 的情况。操作,如果文件无效,NULL将被退回。想象一下,如果所有这些代码都被更改会很麻烦,不幸的是,它是 ANSI C 标准的一部分,因此在 $$$ 方面进行非常昂贵的练习,以使所有这些更改以适应 NULL 替换的新约定。

查看 C FAQ 中关于臭名昭著的 NULL 指针的此常见问题解答.

编辑:
顺便说一句,“我得到空终止的字符串、没有长度的数组和其他一些东西是不好的”这是一种错误的说法,因为你混淆了这两者……正如 Peter Van Der Linden 的“专家”的作者C Programming - Deep C Secrets',一个带有一个 l 的 nul 是一个 '\0',一个带有两个 l 的 null 是一个 NULL!没有 null 终止之类的东西,应该读作 nul 终止,即 '\0' 是表示字符串结束的占位符。

希望这可以帮助,
最好的祝福,
汤姆。

关于null - 没有NULL的类C语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173191/

相关文章:

MySQL 查看列为 NULL 的位置

ios - 一些 IBOutlet 指向 nil

WPF:添加空值作为静态资源

javascript - 匿名函数被认为是有害的?

c++ - 通过复制派生类的另一个对象来创建派生类的对象时调用基类的复制构造函数

java - 为什么字符串输出中会出现空值?

javascript - 处理编程平均图像

regex - 正则表达式在理论上足够强大有什么用?

algorithm - 比 O(n log n) 更快的通用且实用的排序算法?

oop - 为什么 Rust 不支持特征对象向上转换?