如何在 C 中检查 NULL 指针?

How to check for NULL pointer in C?

这学期我有一个C的作业,老师说我应该把这个函数写的不那么复杂。 我是编程新手,似乎找不到答案。他说我们在 class 做了一些这类的东西,但我找不到这样的东西。

int checkforerror(int argc){
    if (argc != 3) {
        fputs("Too little or too many arguments!\n", stderr);
        exit(EXIT_FAILURE);
    }
}

他还指出,我必须检查函数中的空指针。我在 class 中编写的某些程序中发现了一些空指针检查,但我不确定这样是否好。

int mycmp(char *s1, char *s2){

    if (!(s1 && s2))
       return EXIT_FAILURE;

所以我们在课程中做了类似的事情。 我也想过这个:

if (s1 == NULL && s2 == NULL)
   return EXIT_FAILURE;

我真的不知道它们是否真的是空指针检查,我应该使用哪个。

你能帮我解决这些问题吗?

根据De_Morgan's_laws

(not (A and B) = not A or not B)

您的情况

if (!(s1 && s2)) 

相同
 if (!s1 || !s2))  //same as if (s1 == NULL || s2 == NULL)

你在这里检查 s1s2 是否是 NULL,如果是你就退出。


但在第二个

if (s1 == NULL && s2 == NULL)
   return EXIT_FAILURE;

如果 s1s2 都是 NULL 那么你就退出了。

如果 s1s2 中的任何一个不是 NULL 您将继续并尝试访问它们,从而调用未定义的行为。

如果你想 return EXIT_FAILUREany 的指针是 NULL 时,使用第一个选项,即

if (!(s1 && s2))
       return EXIT_FAILURE;

如果你想 return EXIT_FAILURE 两个 指针都是 NULL 时,使用第二个选项,即

if (s1 == NULL && s2 == NULL)
   return EXIT_FAILURE;

NULL 的实际值是实现定义的。所以最好不要执行假设NULL的值为特定值的逻辑运算。

只是为了完成其他答案,您似乎对 null 指针(也许根本不是指针)的定义感到困惑。

简要介绍一下这两点:在 C 语言中,指针 是一个指向另一个 "object" 的变量。更具体地说,pointer 是一个存储内存地址的变量,您在其中有一些其他数据。查看 [1] 以获取更多示例。 null 指针,在指针的上下文中,表示 指针变量 指向 "nowhere" [2]。这通常用于区分您是否指向某些有效(即非空)或无效(即空)数据。

除了其他人所说的使用 if (s1 == NULL || s2 == NULL) 之外,我还想提及下一行,即 return EXIT_FAILURE。我不确定你为什么要这样做。

EXIT_FAILURE, and EXIT_SUCCESS are macro constants usually used with the exit 函数来指示程序的失败或成功(分别)。在一个看起来像是在进行字符串比较的函数中返回它们是没有意义的。你知道这些常量的值是多少吗? EXIT_SUCCESS 可能为零,但是EXIT_FAILURE

的值是多少

您应该考虑使用对该函数实际有意义的值,即

  • 0 等于
  • 1 如果 s1 大于 s2
  • -1否则。