2011-07-19 137 views
1

我有一个结构,我用来建立一个链表如下;分配最近释放的内存

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一遍又一遍,但自由如下每一次的malloc它:

struct my_struct *_my_list; 

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

我每次填充列表,我打印字符数组,然后复位_my_struct由上面的代码。 以上代码在Ubuntu pc上工作正常,但在Cent OS上正确打印第一个列表(在第一个malloc _my_struct之后)后,列表被打印为损坏的数据。

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

_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; 
} 

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

+0

我认为你需要证明填充列表的代码而且,'my_list'一个'结构my_struct' –

+0

发布你的?完整的示例您缺少一个typedef或一些结构 –

+1

如何填充列表。在自由列表函数中recv = NULL什么也不做。您最好传递my_struct **,以便从列表中清除列表指针该例程。 –

回答

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()时,行为是不确定的(你正在释放一些你永远不会得到的东西 - 所以结果很可能是后来某件事或其他东西的损坏)尝试将你的声明更改为: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; 
}