strlen没有检查NULL

har*_*ari 25 c segmentation-fault strlen

为什么strlen()不检查NULL?

如果我这样做strlen(NULL),就会出现故障.

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

Hog*_*gan 30

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

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

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

 int someStrLen;

 if (someStr != NULL)  // or if (someStr)
    someStrLen = strlen(someStr);
 else
 {
    // handle error.
 }
Run Code Online (Sandbox Code Playgroud)

  • "管理"......这是对的.想象一下,每个功能都开始非常偏执,并检查每一个可能的错误.Printf存储列表中每个参数的元信息,每个数学运算检查溢出等.这是管理的. (2认同)
  • @RI猜测我们不同意"标准模板"的含义.也许你更喜欢"有用的模式"?如果你对这个术语感觉更好,我很好. (2认同)
  • 在 c11 中,如果 str 是空指针,则有 `strnlen_s(str, strsz)` 返回零。 (2认同)

Joh*_*ode 19

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

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


nin*_*alj 5

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


小智 5

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

#define strlens(s) (s==NULL?0:strlen(s))
Run Code Online (Sandbox Code Playgroud)

  • 只是不要把它调成`strlens(p ++)` (10认同)