无法保存strlen返回值

时间:2011-06-16 10:35:13

标签: c string-length

我正在使用c字符串库的strlen函数。我传递了一个NULL 字符串,发现神秘的结果。我知道我不应该传递NULL字符串,但我需要一个解释。代码看起来像这样

main()
{
  int k;
  char *s=NULL;
  strlen(s);
  // k = strlen(s);
}

在我的gcc编译器上,它与评论运行良好。 但是如果你要删除该行中的评论 k=strlen(s);

它会产生分段错误。 有什么解释吗?

3 个答案:

答案 0 :(得分:3)

将空指针传递给strlen会导致 undefined behvaiour 任何事情都可能发生。包括seg-faults。并且不包括任何段错误。

如果您想知道确切原因,那么您需要查看编译器生成的汇编代码。但这不会告诉你任何有用的东西。

答案 1 :(得分:3)

第一个未分配其返回值的'strlen'调用可能正由编译器优化。

答案 2 :(得分:1)

这是没有赋值给int变量的汇编程序代码

movq    $0, -16(%rbp)
movl    $0, %eax
leave
ret

编译器不会调用_strlen,因为该值不会被使用