strncmp
如果第三个参数为零,将 NULL 指针作为参数是否安全?即像这样的调用:
strncmp(NULL, "foo", 0);
这是未定义的行为。
C 标准规定,一般来说,您不应将无效指针传递给库函数。
引用C11
,第 7.24.1 章,“字符串函数约定”,(强调我的)
如果声明为的参数
size_t n
指定函数数组的长度,则n
在调用该函数时可以将值设为零。除非在本小节中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如7.1.4中所述。在这样的调用中,定位字符的函数找不到任何出现,比较两个字符序列的函数返回零,复制字符的函数复制零字符。
strncmp()
而且我在 7.24.4.4功能中没有看到任何具体提及(作为上述约束的例外) 。
要为“无效指针”添加上下文,请引用 §7.1.4/p1,使用库函数
[...]如果函数的参数具有无效值(例如函数域之外的值,或程序地址空间之外的指针,或空指针,或指向不可修改的指针当相应的参数不是 const 限定的)或具有可变数量参数的函数不期望的类型(提升后)时,行为是未定义的。[...]
以及关于NULL
,引用§7.19,<stddef.h>
NULL
它扩展为实现定义的空指针常量;[...]