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 に答える