21

strncmp如果第三个参数为零,将 NULL 指针作为参数是否安全?即像这样的调用:

strncmp(NULL, "foo", 0);
4

2 回答 2

34

这是未定义的行为

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
它扩展为实现定义的空指针常量;[...]

于 2016-06-23T14:12:38.127 回答
7

来自cppreference.com的 Cstrncmp文档:

lhsrhs为空指针时,行为未定义。

只需阅读文档。

于 2016-06-23T14:12:11.907 回答