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