我有一个结构用于构建链接列表,如下所示;
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;
}
可能是什么原因,任何想法?
答案 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;
}