34

为什么strlen()不检查NULL?

如果我这样做strlen(NULL),程序分段错误。

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

4

6 回答 6

38

它背后的原因很简单——你如何检查不存在的东西的长度?

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

c 中的标准模板如下所示

 int someStrLen;

 if (someStr != NULL)  // or if (someStr)
    someStrLen = strlen(someStr);
 else
 {
    // handle error.
 }
于 2011-04-26T20:34:12.797 回答
22

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

C 标准库设计背后的理念是程序员最终处于了解是否真的需要执行运行时检查的最佳位置。回到以千字节为单位测量总系统内存的时代,执行不必要的运行时检查的开销可能非常痛苦。因此,C 标准库不会费心进行任何这些检查;如果确实有必要,它假定程序员已经完成了它。如果您知道永远不会将错误的指针值传递给(例如,您传递的是字符串文字或本地分配的数组),那么就没有必要通过对 NULL 进行不必要strlen的检查来弄乱生成的二进制文件。

于 2011-04-26T21:29:02.527 回答
5

该标准不需要它,因此实现只是避免了测试和潜在的昂贵跳跃。

于 2011-04-26T20:34:58.707 回答
5

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

#define strlens(s) (s==NULL?0:strlen(s))
于 2014-01-02T11:29:19.670 回答
3

三个重要原因:

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

  • 它会产生运行时开销——调用strlen数千次并且总是在做str != NULL是不合理的,除非程序员被视为娘娘腔;

  • 它增加了代码的大小——它可能只有几条指令,但如果你采用这个原则并在任何地方都这样做,它会显着增加你的代码。

于 2011-04-26T20:57:01.737 回答
2
size_t strlen ( const char * str );

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

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

于 2011-04-26T20:36:22.230 回答