释放一个变量malloc并返回c中的函数?

时间:2015-11-03 23:57:14

标签: c malloc free

我有一个用户链表,因此我已经完成了这个从链表中删除用户的功能:

puser* delete_user(puser* list_users, int fd_to_delete) {

puser *save_users;
save_users = (puser *)malloc(sizeof(puser));
save_users = list_users;
int nb_users = 0;

nb_users = count_user(list_users);

// only one user
if(nb_users == 1)
    free(list_users);
    return NULL;

// several users
if(nb_users > 0) {

    // if it's the first user of the list
    if(user_get_fd(list_users) == fd_to_delete)
        return user_get_next_one(list_users);

    // else 
    while(list_users != NULL) {

        if(user_get_next_one(list_users) != NULL) {

            if(user_get_fd(user_get_next_one(list_users)) == fd_to_delete)
                list_users->next_client = user_get_next_one(user_get_next_one(list_users));
        }
    list_users = user_get_next_one(list_users);
    }

    return save_users;
}
return save_users;}

我有malloc" save_users",但我需要返回此值。我的问题是如何释放这个变量?

谢谢

2 个答案:

答案 0 :(得分:1)

你可以调用free(),但更好的做法是在你的api中提供另一个函数,例如free_save_users(),并在这个函数中调用free(),以防万一你需要改变内存的方式分配

答案 1 :(得分:0)

如果你想保持这种状态,你可以决定不返回puser *。

相反,你可以传递一个puser **,指向puser * list_user的位置。然后你可以在这一行中取消引用这个puser **:

save_users = *list_users;

在你的功能结束时,你可以释放(* list_user),设置* list_user = save_users。

所以:

puser * list_user ...;
delete_user(&list_user, ...);

现在是delete_user:

void delete_user(puser** list_user, ...){
    puser * saved_user = malloc(...);
    saved_user = *list_user;
     ... Do stuff to saved user ...
    free(*list_user);
    *list_user = saved_user;
}

现在,当您的函数退出时,list_user现在指向您在函数中分配的saved_user。您不再需要释放saved_user。你可以免费使用旧的list_user。

显然,free必须是一个可以释放数据结构的函数。