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