C语言中双指针的NULL检查:函数参数双指针需两次空检吗?
C语言中双指针的NULL检查:是否需要两次校验?
是的,你给出的代码里的两次NULL检查都是必要的,下面分别说清楚原因:
第一次检查
if (node == NULL):node是传入的双指针参数本身,如果调用者调用函数时直接传了NULL(比如写成dynll_free_node_and_object(NULL)),此时对*node进行解引用会触发未定义行为(通常是程序崩溃)。这一步检查是为了确保双指针本身是有效的,指向了一个合法的单指针地址。第二次检查
if (*node == NULL):*node是双指针指向的那个节点指针,如果这个指针本身就是NULL,后续访问(*node)->obj、(*node)->prev等成员同样会触发未定义行为。虽然free(NULL)是C标准允许的安全操作,但你的函数逻辑是要释放节点及其关联的对象,传入空节点时没必要执行后续操作,返回不同的错误码还能让调用者区分“双指针无效”和“节点指针为空”两种错误场景,更便于调试。
附上你提供的示例代码:
typedef struct no_t no_t; struct no_t { no_t *prev; no_t *next; void *obj; }; int32_t dynll_free_node_and_object(no_t **node) { if (node == NULL) return -1; if (*node == NULL) return -2; free((*node)->obj); (*node)->obj = NULL; (*node)->prev = NULL; (*node)->next = NULL; free(*node); *node = NULL; return 0; }
内容的提问来源于stack exchange,提问作者baldhead
相关产品推荐
相关产品推荐

