11

我有以下内容struct

typedef struct cell Cell;
struct cell {
    int value;
    int *nextcell;
};

我有以下功能来释放链表:

void freelist(Cell *beginning)
{
    Cell *thisCell = beginning;
    Cell *NextCell = beginning->nextcell;

   while (thisCell != NULL)
   {
        NextCell = thisCell->nextcell;
        free(thisCell);
        thisCell = NextCell;
   }

   /* Here comes my question. Do I need to free the following variables? */
   free(beginnig);
   free(thisCell);
   free(NextCell);
}
4

2 回答 2

10

不,释放是为了动态分配的内存,指针只是一个指向那里的变量。您的循环释放了列表占用的所有内存 - 那时没有任何东西可以释放,并且尝试再次释放相同的内存(开始)会导致错误。循环后的 thisCell 为 NULL ,那里甚至没有什么可以释放的。

如果您指的是指针本身,它们不会动态分配内存,当您定义它们时,它们每个都在堆栈上占用一个插槽,离开函数将释放该插槽。这里我们只讨论指针本身(存储它们指向的地址的地方),而不是它们可能持有的指向内存。

于 2013-09-28T22:39:57.020 回答
2

无论指针存储在何处,您都可以释放分配的内存 - 在局部变量中,在全局/静态变量中,或在自由存储本身上分配的指针中。

您的函数多次释放多个指针:您不需要函数底部的三个 free 调用中的任何一个(尽管第二个调用是无害的,因为它将 NULL 传递给 free,这总是可以的)。

于 2013-09-28T22:43:15.890 回答