【问题标题】:Deleting an entire linked list in C, gone wrong在 C 中删除整个链表,出错了
【发布时间】:2013-11-24 01:35:30
【问题描述】:

所以我正在尝试使用这个函数来删除 C 中的整个单链表。

    void zeroList( struct node *head)
    {
        struct node* tempDelete;
        struct node* current = head;

        while(current != NULL)
        {
            tempDelete = current;
            current = current->next;
            free(tempDelete);

        }   
    }

我遇到了一个问题,因为当我尝试验证列表本身是否已被删除(通过打印它)时。我留下的东西看起来像这样:

{ 0->146513968->146513952->146513936-> NULL }
{ 146513920->146514048->146514032->146514016->146514000-> NULL }
{146513984->146514064->146514080->146514096->146514112->146514128->146514144->146514160->146514176-> NULL }

我的印象是节点不会仍然存在,或者至少它们会包含 NULL 值。谁能解释为什么我会收到这些奇怪的垃圾号码?

【问题讨论】:

  • 你打印的到底是什么?
  • 我打印的值是结构节点内的整数。

标签: c linked-list free


【解决方案1】:

一旦你释放内存,它的内容是不确定的,你不应该去碰它们。这就是为什么你不应该设置一个指向你选择的随机值的指针的原因(操作系统需要让你访问它。)

您看到的值是垃圾,并且是预期的,因为操作系统不会将内存归零。如果要确保内存中没有任何内容,则需要自己清除指针:

current = current->next;
tempDelete->next = NULL;

PS.:但是,这并不能保证函数结束时头部为 NULL。

【讨论】:

  • 操作系统通常不会将内存归零。不过,如果它想这样做的话,它可能会。一旦您不再拥有某个特定位置,您就真的无法信任它——即使它是垃圾,甚至它的值看起来不像您在释放内存之前存储在那里的合法值。
  • @Charles,感谢您提供的信息。这似乎可以完成这项工作,但是我仍然在每个列表的开头得到一个工件。这是因为头部不能保证为NULL吗?我不确定如何在函数结束时将 head 显式设置为 NULL。我试过分配,但这似乎没有什么不同。
  • 如前所述,您不应该相信释放后的内存:在调用您的函数后,您不应该触摸头部或列表元素。您对释放的内存所做的任何事情都是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2019-03-10
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多