strcmp行为

14

当我运行以下代码时:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    p = strcmp(NULL,"foo");

    return 0;
}
我收到段错误。echo $? 显示 139。但是当我运行
#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    strcmp(NULL,"foo"); // Note removed assignment

    return 0;
}

我没有得到任何分段错误。有人可以帮忙解释一下吗?

这是我的gcc信息:

> gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8)
3个回答

30

你可能在编译时使用了优化选项。由于第二个代码片段中 strcmp() 的结果被忽略了,编译器会消除这个函数调用,这就是为什么你的程序不会崩溃的原因。这个调用之所以能够被消除,是因为 strcmp() 是一个内置函数,编译器知道这个函数没有任何副作用。


好的,我并没有进行任何编译器设置来开启优化,但它会自动执行。你说得没错。 - Ashish Vyas
2
gcc使用SSA,即使没有启用优化也可以工作。 SSA可以删除死代码。http://en.wikipedia.org/wiki/Static_single_assignment_form - Maxim Egorushkin

6

你需要:

  • 包含适当的头文件,或手动声明函数。对于strcmp(),你需要<string.h>
  • 不要传递无效指针(如NULL)给strcmp(),因为它不会保护它并会解引用指针,从而导致程序中未定义的行为。

6
OP知道NULL是无效的,但想知道这两种情况为什么不同。 - Jim Balter

3
你所做的操作是未定义的。 strcmp 需要有效的指向以 null 结尾的字符串的指针。 NULL 不是指向以 null 结尾的字符串的指针。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接