2

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

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

在我的 gcc 编译器上,它在注释中运行良好。但是如果您将删除该行中的注释 k=strlen(s);

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

4

3 回答 3

3

将空指针传递给strlen导致未定义的行为。 什么事情都可能发生。 包括段错误。并且不包括段错误。

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

于 2011-06-16T10:37:06.933 回答
3

未分配其返回值的第一个“strlen”调用可能已被编译器优化。

于 2011-06-16T10:38:01.923 回答
1

这是没有分配给 int 变量的汇编代码

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

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

于 2011-06-16T10:48:29.057 回答