以下是传统系统中最流行的strcpy实现.为什么在开始时没有检查dest和src是否为NULL?我曾经听说过,在过去,记忆力有限,所以短代码总是首选.你现在可以在开始的几天用NULL指针检查实现strcpy和其他类似的函数吗?为什么不?
char *strcpy(char *dest, const char *src)
{
char *save = dest;
while(*dest++ = *src++);
return save;
}
Run Code Online (Sandbox Code Playgroud)
ten*_*our 20
NULL是一个糟糕的指针,但也是如此(char*)0x1.它还应该检查吗?在我看来(我不知道明确的原因),在这种低级操作中进行健全性检查是不必要的.strcpy()是非常基础的,它应该被视为asm指令,如果需要你应该在调用者中进行自己的健全性检查.只是我的2美分:)
det*_*tly 15
没有健全性检查,因为C最重要的潜在意识形态之一是开发人员提供了理智.当你假设开发人员是理智的时候,你最终会得到一种可以用来做任何事情的语言.
这不是一个明确规定的目标 - 人们很有可能想出一个可以检查这个的实现,甚至更多.也许他们有.但我怀疑许多习惯于C的人会吵着要使用它,因为如果他们的代码有可能被移植到更常见的实现中,他们无论如何都需要进行检查.
Phi*_*ter 11
整个C语言都写着"如果程序员知道他在做什么,我们会正确行事".程序员应该知道他需要做出的所有检查.这不只是检查NULL,它确保dest点到足够分配的内存来保存src,它检查返回值fopen,以确保该文件确实没有成功打开,知道什么时候memcpy是安全的,如果memmove需要,等等.
获取strcpy检查NULL不会改变语言范式.您仍然需要确保dest指向足够的空间 - 这是在不更改界面的情况下strcpy 无法检查的内容.您还需要确保srcis '\0'-terminated,这也是strcpy无法检查的.
有一些C标准库函数,其不检查NULL:例如,free(NULL)始终是安全的.但总的来说,C希望你知道你在做什么.
[C++通常会避开<cstring>图书馆而有利于std::string朋友.]
通常情况下,库让调用者决定它想要的失败语义通常更好.strcpy如果这两个论点是什么,你会怎么做NULL?默默地什么都不做?失败assert(在非调试版本中不是一个选项)?
选择加入比选择退出更容易.编写自己的包装器strcpy可以轻松验证输入并使用它.但是,如果图书馆自己这样做了,那么你就没有办法选择不再执行这些检查strcpy.(例如,您可能已经知道您传递给的参数strcpy不是NULL,如果您在紧密循环中调用它或者担心最小化功耗,则可能是您关心的事情.)通常,它更好在给予更多自由方面犯错(即使这种自由带来了额外的责任).
| 归档时间: |
|
| 查看次数: |
5173 次 |
| 最近记录: |