gpt4 book ai didi

c - 分配最近释放的内存

转载 作者:太空宇宙 更新时间:2023-11-04 04:05:17 28 4
gpt4 key购买 nike

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

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;

每次填充列表时,我都会打印 char 数组,然后通过上面的代码重置 _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;
}

可能是什么原因,有什么想法吗?

最佳答案

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

struct my_struct *_my_list;

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

当你初始化结构时:struct my_struct *_my_list; 你没有给它赋值,所以它保存了内存中的任何垃圾数据。当你在 free_my_list 中 free() 时,行为是未定义的(你正在释放你从未 malloc()ed 的东西 - 所以结果很可能是某些东西的损坏或其他稍后。尝试将您的声明更改为: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;
}

关于c - 分配最近释放的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6743080/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com