分配最近释放的内存

时间:2011-07-19 06:26:42

标签: c malloc free

我有一个结构用于构建链接列表,如下所示;

struct my_struct{
    char a[16];
    struct my_struct *next;
}

我通过以下功能释放该链接列表;

void free_my_list(struct my_struct* recv) {

     if (recv->next != NULL)
         free_my_list(recv->next);

     free(recv);
     recv = NULL;
}

在我的程序中,我一遍又一遍地使用结构_my_list但每次都使用free和malloc,如下所示:

struct my_struct *_my_list;

free_my_list(_my_list);
_my_list = (my_list *) malloc(sizeof(my_list));
_my_list->next = NULL;

每次填写列表时,都会打印char数组,然后通过上面的代码重置_my_struct。 上面的代码在Ubuntu pc上工作正常,但是在正确打印第一个列表(在第一个malloc _my_struct之后)的Cent OS上,下面的列表被打印为损坏的数据。

当我在整个程序执行过程中没有释放和malloc内存时,它在Cent OS中工作正常,但我应该在_my_list次调用之间重置列表printf()

_my_list通过以下功能填写并打印;

/*prints every item in my_list*/
void print_my_list(struct my_struct *recv, FILE *fd) {

   my_list *tmp;
   tmp = recv;

   while (tmp != NULL) {
       if (fwrite(tmp->a, 1, strlen(tmp->a), fd) == -1) {
               pritnf("error\n");
        }
       tmp = tmp->next;
   }
}

/*Add 'a' string to _my_list*/
void add_recv_to_list(struct my_struct **recv_list, char *recv) {

struct my_struct *tmp;
tmp = *recv_list;

if (*recv_list == NULL) {
    *recv_list = (struct my_struct *) malloc(sizeof(struct my_struct));
    tmp = *recv_list;

} else {

    while ((tmp->next) != NULL) {
        tmp = tmp->next;
    }
    tmp->next = (struct my_struct *) malloc(sizeof(struct my_struct));
    tmp = tmp->next;

}
strncpy(tmp->a, recv, MAX_NAME_LEN);
tmp->next = NULL;
}

可能是什么原因,任何想法?

1 个答案:

答案 0 :(得分:1)

我认为你的问题可能从这里开始:

struct my_struct *_my_list;

free_my_list(_my_list);
_my_list = (my_list *) malloc(sizeof(my_list));
_my_list->next = NULL;

初始化struc:struct my_struct *_my_list;时,不会为其分配任何值,因此它会预先保存内存中的垃圾数据。当你在free_my_list中free()时,行为是未定义的(你正在释放你从未malloc()编辑过的东西 - 所以结果很可能是某些东西或其他东西的损坏。尝试将你的声明改为:struct my_struct *_my_list = NULL;(始终是将指针初始化为NULL的好方法)并将free_my_list函数更改为:

void free_my_list(struct my_struct* recv) {
    if (recv == NULL)
         return;

     if (recv->next != NULL)
         free_my_list(recv->next);

     free(recv);
     recv = NULL;
}