在C中释放指向链表的双指针

在C中释放指向链表的双指针,c,list,pointers,C,List,Pointers,我对c有点陌生,尝试使用一个链表来实现堆栈。为了实现push和pop函数,我传递了一个双指针。在main中,我将Node*Node_头初始化为NULL 我使用malloc和free成功地处理了内存泄漏,但似乎我在某个地方有内存泄漏,我无法弄清楚。释放双指针时是否应该采取不同的方法?谢谢,以下是两个功能: void stack_push(Node **node_head, int d) { Node *node_new = malloc(sizeof(Node)); node_n

我对c有点陌生,尝试使用一个链表来实现堆栈。为了实现push和pop函数,我传递了一个双指针。在main中,我将Node*Node_头初始化为NULL

我使用malloc和free成功地处理了内存泄漏,但似乎我在某个地方有内存泄漏,我无法弄清楚。释放双指针时是否应该采取不同的方法?谢谢,以下是两个功能:

void stack_push(Node **node_head, int d)
{
    Node *node_new = malloc(sizeof(Node));

    node_new -> data = d;
    node_new -> next = *node_head;
    *node_head = node_new;
}

int stack_pop(Node **node_head)
{
    Node *node_togo = *node_head;
    int d = 0;

    if(node_head)
    {
        d = node_togo -> data;
        *node_head = node_togo -> next;
        free(node_togo);
    }
    return d;
}

代码中唯一的错误是在函数堆栈中

if(node_head)
当然,您可以检查node_head是否等于NULL,尽管在我看来这是一个superfluos检查。但您必须检查*node_head是否不等于NULL

函数可能看起来像

int stack_pop(Node **node_head)
{
    int d = 0;

    if( *node_head )
    {
        Node *node_togo = *node_head;

        d = node_togo -> data;

        *node_head = node_togo -> next;

        free( node_togo );

    }

    return d;
}

您的代码不是有效的C代码。函数定义之后的**是什么?另外,请决定你想要的C和C++是哪一种,它们不是同一种语言。但是由于赋值的原因,node_head和node_togo是相同的。@harper这不是为了可读性,而是为了正确的逻辑。node_head和node_togo不相同,*node_head和node_togo不相同。由于您已经取消引用了上面的node_head,它保证为非null,并且if条件始终为true。@ThunderGr释放null指针没有任何效果。@ThunderGr将null指针传递给free是完美的,因为不会发生任何操作。请参阅第7.20.3.2节,感谢您的反馈!我理解将*node_head检查为NULL的想法。关于我的代码的可读性,我想我不明白这些批评是从哪里来的。我可以做些什么来提高代码在C语言中的可读性?再次感谢您的帮助!