我需要释放局部变量吗?

时间:2013-09-28 22:36:33

标签: c pointers linked-list free

我有以下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);
}

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

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

你的函数多次释放几个指针:你不需要在函数底部释放三个调用中的任何一个(尽管第二个调用是无害的,因为它将NULL传递给free,这总是正常的。)< / p>