Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分配最近释放的内存_C_Malloc_Free - Fatal编程技术网

C 分配最近释放的内存

C 分配最近释放的内存,c,malloc,free,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

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

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;
}
在我的程序中,我反复使用struct
\u my_list
,但每次都是免费的,如下所示:

struct my_struct *_my_list;

free_my_list(_my_list);
_my_list = (my_list *) malloc(sizeof(my_list));
_my_list->next = NULL;
每次填写列表时,我都会打印字符数组,然后用上面的代码重置我的结构。 上述代码在Ubuntu pc上运行良好,但在Cent OS上正确打印第一个列表(在第一个malloc_my_struct之后)后,以下列表将作为损坏数据打印

当我在整个程序执行期间没有释放和malloc内存时,它在Cent OS中也可以正常工作,但我应该在
printf()
调用之间重置list
\u my\u 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;
初始化struc时:
struct my_struct*\u my_list您不给它赋值,所以它保存内存中预先存在的垃圾数据。当你
free()
在free\u my\u列表中,行为是未定义的(你正在释放一些你从未
malloc()
ed的东西-因此结果很可能是以后某个东西或其他东西的损坏。试着将你的声明更改为:
struct my\u struct*\u my\u 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;
}

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

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\u struct*\u my\u list;
时,您不会给它赋值,因此它会保存内存中预先存在的垃圾数据。当您
free()
在free\u my\u list中,行为是未定义的(您正在释放一些从未
malloc()过的内容)
ed-因此以后很可能会导致某些东西的损坏。请尝试将声明更改为:
struct my\u struct*\u my\u list=NULL;
(无论如何,初始化指向NULL的指针始终是一个很好的做法)并将free\u my\u 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;
}

我想您需要显示填充列表的代码。另外,
my_list
a
struct my_struct
?发布完整的示例。您缺少一个typedef或几个structshow,是否填充列表。另外,free list函数中的recv=NULL没有任何作用。您最好传递my_struct**以便从我在那个例程中。通常你会循环直到当前元素的next为NULL,我更想知道你是如何将元素添加到列表中的。我猜这是偶然的,即最后一个元素的next为NULL。我不太明白这个问题,也许你需要显示更多的代码。在你的示例中,它看起来像是第一次调用free\u My\list将使用一个统一化的参数生成-但我怀疑您是否真的这样做。我认为您需要显示填充列表的代码。另外,
my_list
a
struct my_struct
?发布您的完整示例。您缺少一个typedef或几个structshow,是否填充列表。在free list函数中也是recv=NULL什么都不做。你最好传递我的结构**,这样你就可以从例程中清除列表指针。通常你会循环直到当前元素的下一个为空,我更想知道你是如何将元素添加到列表中的。我猜这是偶然的,即最后一个元素的下一个为空。我不太明白这个问题,perhaps您需要显示更多的代码。在您的示例中,第一次调用free_my_list似乎是使用一个统一的参数进行的,但我怀疑这是您真正在做的。