strcmp行为

strcmp行为,c,string,strcmp,C,String,Strcmp,当我运行以下代码时: #include <stdio.h> int main(int argc, char *argv[]) { int p = 0; p = strcmp(NULL,"foo"); return 0; } 你所做的是不明确的strcmp需要指向以null结尾的字符串的有效指针 NULL不是指向以NULL结尾的字符串的指针。您需要: 包括正确的标题,或手动声明函数。对于strcmp(),您需要 不要将无效指针(如NULL)传递给str

当我运行以下代码时:

#include <stdio.h>

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

    p = strcmp(NULL,"foo");

    return 0;
}

你所做的是不明确的
strcmp
需要指向以null结尾的字符串的有效指针

NULL
不是指向以NULL结尾的字符串的指针。

您需要:

  • 包括正确的标题,或手动声明函数。对于strcmp(),您需要
  • 不要将无效指针(如NULL)传递给
    strcmp()
    ,因为它不保护指针,并且会取消对指针的引用,从而导致程序中出现未定义的行为

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

OP知道NULL无效,但询问这两种情况为何不同。我没有做任何编译器设置来启用优化,但它会自动启用。你是现场。gcc做SSA,即使没有优化启用。SSA可以删除死代码。
#include <stdio.h>

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

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

    return 0;
}
> gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8)