我有以下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);
}
不,释放是针对动态分配的内存的,指针只是一个指向那里的变量。您的循环释放了列表占用的所有内存 - 此时没有什么可以释放的,尝试再次释放相同的内存(开始)会导致错误。循环后的这个单元格是空的,那里甚至没有可以释放的东西。
如果你指的是指针本身,它们不会动态分配内存,当你定义它们时,它们各自在堆栈上占据一个插槽,离开函数会释放该插槽。在这里,我们只讨论指针本身(它们指向的地址存储位置),而不是它们可能持有的指向内存。
无论指针存储在何处,都可以释放分配的内存 - 在局部变量中、全局/静态变量中或在自由存储本身上分配的指针中。
您的函数多次释放多个指针:您不需要在函数底部释放三个调用中的任何一个(尽管第二次调用是无害的,因为它将 NULL 传递给 free,这总是可以的)。