什么是需要使用空指针才能正确执行的应用程序示例?简单地检查空指针并进行测试不算数。这个例子应该是 C 程序员“常用的”。
经过一番思考,我有一个可能的例子,但我不想影响反应(还)。
编辑:这个问题是一个编程工作的面试,需要知识,但不需要 C 中的上帝般的技能。答案不会是该语言的一些深奥方面。
execvp
系列函数期望参数列表以空指针终止。例如,
execvp("/bin/ls", arguments);
这里arguments
应该以NULL结尾。
该函数strtok()
在第二次和后续迭代中依赖于 NULL;其表现较好的亲戚strtok_r()
和strtok_s()
.
重点稍有不同:
字符串搜索函数,例如strchr()
和strstr()
在找不到您要求他们查找的内容时返回 NULL 指针。
当分配失败时,内存分配函数返回 NULL 指针。
该fopen()
函数在打开文件失败时返回一个 NULL 指针。
该opendir()
函数在打开目录失败时返回一个 NULL 指针。
注意到这里的主题了吗?NULL 指针通常作为错误指示返回。这是否算作“只是检查”也许更值得商榷。
链接列表。
struct node
{
int data;
node* next;
}
最后一个指针总是必须是NULL
,对吧?如果不是,程序将无法正确执行。这仍然可以算作测试,但它是正确执行程序所必需的。想法?
NULL 值显然对于指示某个值的“结束”或“不存在”非常有用。例如,函数中的可选参数由 NULL 表示。或“尚未分配...”。
但是 NULL 值作为参考没有用,除了比较之外,在不需要指针时使用 NULL 值或赋值是不正确的[显然,假设它已被正确释放]。
我正在处理一段在操作系统启动早期运行的代码 - 在代码的后期运行中,它需要在某些地方具有当前任务。但在系统正常启动之前,没有当前任务。所以我需要指出“没有当前任务”。我使用 NULL 指针 [然后如果指针为 NULL 则访问相关的“保留”数据结构] 和一个变量来检查是否已创建任务。[这很简单,但概念适用]。
从技术上讲,在 MS-DOS(或“实模式”中的其他 8086)中,NULL 指针也将用于设置除以零的向量 [这是“向量零”,向量表位于地址零 - 所以空值]。但是由于现代操作系统[通常]在其他地方有中断向量表,并且零地址通常受到读/写操作的保护,这不再是指针的“有效使用”。当然,其他一些嵌入式系统可能仍然使用地址零来表示“有意义”。
在我的头顶上:
strtok
获取第一个令牌之后的连续令牌;exec*
函数中的参数列表realloc
初始分配NULL
可以安全地传递给free()
,因此在以下代码NULL
中可能会或可能不会获得 -ed 的情况下,初始化指针通常很有用。malloc()
然后,您可以安全地调用free()
,例如在函数的末尾,无论指针是否实际使用,例如
int * p = NULL; // NB: without this initialisation we would need additional logic
// to know whether to call free(p) or not later...
...
if (...)
{
...
if (...)
{
...
p = malloc(42);
...
}
...
}
...
free(p); // free allocated memory, or no-op if p == NULL