如何在 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;
我真的不知道它们是否真的是空指针检查,我应该使用哪个。
你能帮我解决这些问题吗?
(not (A and B) = not A or not B)
您的情况
if (!(s1 && s2))
与
相同
if (!s1 || !s2)) //same as if (s1 == NULL || s2 == NULL)
你在这里检查 s1
或 s2
是否是 NULL
,如果是你就退出。
但在第二个
if (s1 == NULL && s2 == NULL)
return EXIT_FAILURE;
如果 s1
和 s2
都是 NULL
那么你就退出了。
如果 s1
或 s2
中的任何一个不是 NULL
您将继续并尝试访问它们,从而调用未定义的行为。
如果你想 return EXIT_FAILURE
当 any 的指针是 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
否则。
这学期我有一个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;
我真的不知道它们是否真的是空指针检查,我应该使用哪个。
你能帮我解决这些问题吗?
(not (A and B) = not A or not B)
您的情况
if (!(s1 && s2))
与
相同 if (!s1 || !s2)) //same as if (s1 == NULL || s2 == NULL)
你在这里检查 s1
或 s2
是否是 NULL
,如果是你就退出。
但在第二个
if (s1 == NULL && s2 == NULL)
return EXIT_FAILURE;
如果 s1
和 s2
都是 NULL
那么你就退出了。
如果 s1
或 s2
中的任何一个不是 NULL
您将继续并尝试访问它们,从而调用未定义的行为。
如果你想 return EXIT_FAILURE
当 any 的指针是 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
否则。