【问题标题】:freeing a double pointer to a linked list in C在 C 中释放指向链表的双指针
【发布时间】:2014-11-10 07:28:15
【问题描述】:

我对 c 有点陌生,并尝试使用单个链表来实现堆栈。为了实现 push() 和 pop() 函数,我传递了一个双指针。在 main 中,我将 Node *node_head 初始化为 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;
}

【问题讨论】:

  • 您的代码不是有效的 C 代码。这些** 在函数定义应该是什么之后是什么?另外,请决定您想要 C 和 C++ 中的哪一个,它们不是同一种语言。
  • @MohitJain 会更具可读性,是的。但是node_headnode_togo由于赋值是一样的。
  • @harper 这不是为了可读性,而是为了正确的逻辑。 node_headnode_togo 不同,*node_headnode_togo 不同。正如您已经在上面取消引用 node_head 一样,它保证为非 null 并且 if 条件将始终为真。
  • @ThunderGr 释放空指针无效。
  • @ThunderGr 将空指针传递给 free() 是完美的,因为不会发生任何操作。请参阅open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 的第 7.20.3.2 节

标签: c list pointers


【解决方案1】:

您的代码中唯一的错误是在函数 stack_pop 中。

if(node_head)

当然,您可以检查 node_head 是否等于 NULL,尽管在我看来这是一个超级检查。但是你必须检查*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;
}

【讨论】:

  • 感谢您的所有反馈!我理解将 *node_head 检查为 NULL 的想法。关于我的代码的可读性,我想我不明白批评来自哪里。我可以做些什么来使我的代码在“C”中更具可读性?再次感谢您的帮助!
猜你喜欢
  • 2021-07-19
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多