0

我对指针和 C 的想法相对较新,所以如果这是一个非常简单的问题,我深表歉意。我正在尝试从创建的内存中释放一个单链表。单个列表创建得很好,但是我无法从内存中释放它,我遇到了分段错误。有什么想法我哪里出错了吗?我需要为 freelist 和 freenode 提供单独的方法。Avail 是一个全局指针变量,它是我确信可以工作的代码的一部分。问题存在于免费列表中,我只是不确定在哪里。

   void freelist(olnode **list) {
   olnode *ptr = *list;
    while (*list != NULL) {
     ptr = *list
     freenode(&ptr);
     ptr = ptr->next;
    }
   }

   void freenode(olnode **ptr) {
    if(*ptr != NULL) {
     (*ptr)->next = avail;
     avail = *ptr;
     *ptr = NULL:
    }
   }
4

2 回答 2

3

Freenode 将传递给它的指针设置为 NULL。之后 freelist 尝试取消引用现在为空的指针。这就是程序崩溃的地方。

除此之外,您的程序并没有真正释放任何数据。它只是将指向数据的指针更改为指向 NULL。这意味着内存将保持分配状态并且不可用于新数据。要将指针指向的内存标记为不再需要,您需要从标准库中对指向它的指针调用free()方法。之后不需要将指针设置为 NULL,但一个好的做法是确保任何后续尝试访问已释放的内存位置都会导致可预测的崩溃,而不是完全不可预测的行为。

于 2012-09-18T23:33:59.423 回答
1

您需要next在释放它之前从节点中获取指针。

不是这个:

 freenode(&ptr);
 ptr = ptr->next;

但是这个:

 olnode *next = ptr->next;
 freenode(&ptr);
 ptr = next;
于 2012-09-18T23:30:43.253 回答