strlen没有检查NULL

时间:2011-04-26 20:32:27

标签: c segmentation-fault strlen

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

如果我strlen(NULL),则程序分段出错。

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

6 个答案:

答案 0 :(得分:29)

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

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

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

 int someStrLen;

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

答案 1 :(得分:19)

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

一个帮助你悲痛的小宏:

#define strlens(s) (s==NULL?0:strlen(s))

答案 4 :(得分:3)

size_t strlen ( const char * str );

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

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

答案 5 :(得分:2)

三个重要原因:

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

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

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