strcmp行为

时间:2011-02-08 12:14:59

标签: c string strcmp

当我运行以下代码时:

#include <stdio.h>

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

    p = strcmp(NULL,"foo");

    return 0;
}

我得到分段错误。回声$? 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 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:6)

你需要:

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

答案 2 :(得分:3)

你在做什么是未定义的。 strcmp需要有效指针指向以null结尾的字符串。

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