14

当我运行以下代码时:

#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)
4

3 回答 3

30

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

于 2011-02-08T12:22:33.050 回答
6

你需要:

  • 包括正确的标题,或手动声明函数。对于strcmp(),你需要<string.h>
  • 不要将无效的指针(例如 NULL)传递给strcmp(),因为它不能防止它发生并且会取消引用指针,从而导致程序中出现未定义的行为。
于 2011-02-08T12:22:17.007 回答
3

你在做什么是不确定的。strcmp需要指向以空字符结尾的字符串的有效指针。

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

于 2011-02-08T12:20:43.787 回答