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