You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:22:56