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

假设您预定了一个当地的会议室,您计划在那里举行会议和聚会。你什么时候会释放你的预订……在你预订之后,在你开会之后但在你开派对之前,或者在你开完会和派对之后?

mallocfree就像那样......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 回答