我正在使用c字符串库的strlen函数。我传递了一个NULL 字符串,发现神秘的结果。我知道我不应该传递NULL字符串,但我需要一个解释。代码看起来像这样
main()
{
int k;
char *s=NULL;
strlen(s);
// k = strlen(s);
}
在我的gcc编译器上,它与评论运行良好。
但是如果你要删除该行中的评论
k=strlen(s);
它会产生分段错误。 有什么解释吗?
答案 0 :(得分:3)
将空指针传递给strlen
会导致 undefined behvaiour 。 任何事情都可能发生。包括seg-faults。并且不包括任何段错误。
如果您想知道确切原因,那么您需要查看编译器生成的汇编代码。但这不会告诉你任何有用的东西。
答案 1 :(得分:3)
第一个未分配其返回值的'strlen'调用可能正由编译器优化。
答案 2 :(得分:1)
这是没有赋值给int变量的汇编程序代码
movq $0, -16(%rbp)
movl $0, %eax
leave
ret
编译器不会调用_strlen,因为该值不会被使用