嗨我最近在看一个旧的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/