strcmp行为

Ash*_*yas 14 c string strcmp

当我运行以下代码时:

#include <stdio.h>

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

    p = strcmp(NULL,"foo");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到分段错误.回声$?139.但是当我跑的时候

#include <stdio.h>

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我没有任何分段错误.有人可以请一些光吗?

这是我的gcc信息:

> gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8)
Run Code Online (Sandbox Code Playgroud)

Max*_*kin 30

编译时可能正在使用优化选项.由于strcmp()忽略了第二个片段的结果,编译器会删除此函数调用,这就是您的程序不会崩溃的原因.这个调用只能因为strcmp()是一个内部函数而被消除,编译器知道这个函数没有任何副作用.

  • gcc可以在没有启用优化的情况下运行SSA.SSA可以删除死代码.http://en.wikipedia.org/wiki/Static_single_assignment_form (2认同)

unw*_*ind 6

你需要:

  • 包括正确的标题,或手动声明函数.因为strcmp(),你需要<string.h>.
  • 不传递NULL之类的无效指针strcmp(),因为它不能防止它,并且会取消引用指针,从而导致程序中出现未定义的行为.

  • OP知道NULL无效,但是问为什么这两种情况不同. (6认同)