strlen没有检查NULL

为什么strlen()没有检查NULL?

如果我做strlen(NULL) ,它会出错。

试图了解它背后的基本原理(如果有的话)。

它背后的理性很简单 – 你如何检查不存在的东西的长度?

此外,与“托管语言”不同,运行时系统无法正确处理无效数据或数据结构。 (这种类型的问题正是为什么更多“现代”语言更受欢迎的非计算或性能较低的需要应用程序)。

c中的标准模板看起来像这样

  int someStrLen; if (someStr != NULL) // or if (someStr) someStrLen = strlen(someStr); else { // handle error. } 

定义字符串处理库的语言标准部分声明,除非特定函数另有指定,否则任何指针参数都必须具有有效值。

C标准库设计背后的哲学是程序员最终知道是否真的需要执行运行时检查。 回到以千字节为单位测量总系统内存的日子,执行不必要的运行时检查的开销可能非常痛苦。 所以C标准库不打算做任何这些检查; 它假设程序员已经完成了它,如果真的有必要的话。 如果你知道你永远不会将错误的指针值传递给strlen (例如,你传入一个字符串文字,或者一个本地分配的数组),那么就不需要对生成的二进制文件进行不必要的检查以使其混乱。

一个小宏来帮助你的悲伤:

 #define strlens(s) (s==NULL?0:strlen(s)) 
 size_t strlen ( const char * str ); 

http://www.cplusplus.com/reference/clibrary/cstring/strlen/

Strlen将指向字符数组的指针作为参数,null不是此函数的有效参数。

该标准不需要它,因此实现只是避免测试并且可能是昂贵的跳转。

三个重要原因:

  • 标准库和C语言的设计假设程序员知道他在做什么,所以空指针不被视为边缘情况,而是作为程序员的错误导致未定义的行为;

  • 它会导致运行时开销 – 调用strlen数千次并始终执行str != NULL是不合理的,除非程序员被视为娘娘腔;

  • 它增加了代码大小 – 它只能是一些指令,但如果你采用这个原则并在任何地方都这样做,它可以显着增加你的代码。