strcmp行为

当我运行以下代码时:

#include  int main(int argc, char *argv[]) { int p = 0; p = strcmp(NULL,"foo"); return 0; } 

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

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

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

你需要:

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

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

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