0

にデータを入力するときは、curr->data最初にを実行してメモリを割り当てますcurr = (NODE*) malloc (sizeof(NODE));。次に、リストを作成し、最終的にはそれを印刷します。プログラムのどこかで、使用したメモリを解放する必要がありますが、いつ実行するかわかりません。リストを作成した後、またはリストを印刷した後?または私はこれを行うことができますか?

printf("How many elements do you want to make? ");
scanf("%d", &NumElem);
head = NULL;
for (i = 0; i < NumElem; i++)
{
    //memory allocate
    curr = (NODE*)malloc(sizeof(NODE));
    printf("Number %d: ", i+1);
    scanf("%d", &curr->num);
    FLUSH;

    if (head == NULL)/*beginning of the list*/
    {
        curr->next = head;
        head = curr;
        *tail = curr;
    }
    else /*adding on the list*/
    {
        curr->next = head;
        head = curr;
    }
    free (curr);
}//for 

現在のノード内にデータを配置した後、毎回解放できますか?

4

1 に答える 1

6

会議を行ってからパーティーを開く予定のローカル会議室を予約しているとします。予約を解除するのはいつですか...予約した直後、会議を開いた後、パーティーを開く前、または会議とパーティーの両方を行った後ですか?

mallocそしてfreeそのようなものです...mallocあなたの使用のためにメモリの領域をfree予約し、予約をキャンセルします。予約をキャンセルした後もメモリを使い続けると、動作は未定義になります。

あなたの場合、ノードのリスト全体を解放する必要があります。これはループで行うことができますが、一般的なトラップがありnextます。ポインターにアクセスする前にノードを解放します。危険なのは、これはほとんどの場合実際に機能することですが、定義されておらず、場合によっては機能しないこともあります...おそらく、生命にかかわる機械を制御する一部のソフトウェアでは機能しません。今それを行うことを学ぶのが最善です:

void free_list(NODE* list)
{
    while (list)
    {
        NODE* next = list->next;
        free(list);
        list = next;
    }
}

または、もう少しコンパクトな形で、

void free_list(NODE* list)
{
    for (NODE* next; list; list = next)
    {
        next = list->next;
        free(list);
    }
}

ノードに、編集されて解放する必要のある文字列またはその他のオブジェクトへのポインタが含まれている場合malloc、それらの解放呼び出しは、ノード自体を解放する前にfree_listで実行されます。

于 2013-03-26T23:47:33.087 に答える