计算List的大小,是否有必要使用free()?

时间:2016-03-01 12:22:31

标签: c list

我有一个计算链表大小的函数。我得到了一个双重免费或腐败的'当返回前的行被排除temp=NULL时,编译错误,我只会free(temp)。当我在temp=NULL之前添加free(temp)时,代码有效。

我是否因为编译器释放temp及其链接的节点而获得双重免费或损坏? temp=NULL会解决这个问题吗?

最终,是否有必要将free()用于这么小的功能?

typedef struct node{
    int a, b;
    struct node *next;
}Node;

typedef struct list{
    Node* head;
    Node* tail;
}List;

int list_size(List *q){
    Node *temp;
    int i = 1;
    if(q->tail == NULL && q->head == NULL){
        return 0;
    }
    else{
        temp = q->head;
        while(temp->next != NULL){
            temp = temp->next;
            ++i;
        }
        temp = NULL;
        free(temp);
        return i;
    }
}

2 个答案:

答案 0 :(得分:5)

您没有分配任何内存,因此您不需要释放任何内存。无论如何,如果你分配内存,你需要释放它。

需要释放的内存是动态分配的内存。动态分配内存的函数在文档中免费列出:http://en.cppreference.com/w/c/memory/free

答案 1 :(得分:2)

作为一种正确的编程技术,你应该始终free()动态分配的内存,无论我们谈论的是多少内存。 但是,这里没有为temp分配任何内存。因此,您的问题已解决,因为您将temp设置为NULL并实际释放NULL,这不会影响您的程序。