Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
free()在C中的使用_C_Malloc_Free - Fatal编程技术网

free()在C中的使用

free()在C中的使用,c,malloc,free,C,Malloc,Free,我正在做一些C练习(新手),我遇到了一点问题。我得到了一个先进先出队列,并被告知将remove函数修改为FILO 当我省略自由((void*)p时,这很好用;在while循环中,我从前面的方法中获取了这一行。有人能告诉我为什么这条线在那里不起作用吗?我猜我不能完全删除它,因为内存泄漏 /* remove next Item from queue, placing it in the 2nd argument; * return 1/0 if successful/queue empty */

我正在做一些C练习(新手),我遇到了一点问题。我得到了一个先进先出队列,并被告知将remove函数修改为FILO

当我省略自由((void*)p时,这很好用;在while循环中,我从前面的方法中获取了这一行。有人能告诉我为什么这条线在那里不起作用吗?我猜我不能完全删除它,因为内存泄漏

/* remove next Item from queue, placing it in the 2nd argument;
* return 1/0 if successful/queue empty */

int q_remove(Queue *q, Item i) {
struct q_element *p;
if (q->head == NULL)
    return 0;
if(q->head==q->tail){
    p=q->head;
    q->head=NULL;
    q->tail=NULL;
    memcpy(i, p->value, q->size);
    free(p->value);
    free((void *) p);
    return 1;
}
p=q->head;
while(p != NULL){
    if(p->next==q->tail){
        memcpy(i, p->next->value, q->size);
        free(p->next->value);
        q->tail=p;
        q->tail->next=NULL;
        free((void *) p);
        return 1;


    }
    p=p->next;

}

return 0;
}

在我看来,您正在释放
p
,但在此之前,您将
p
的值分配给
q->tail
,使
q->tail
指向即将失效的内存。你实际上是在释放
q->tail


在其他地方,我怀疑你使用了
q->tail
,这会让你的操作系统发出尖叫,并像滚轴上的地狱一样杀死你的程序。

在我看来,你似乎在释放
p
,但在此之前,将
p
的值赋给
q->tail
使
q->tail
指向即将失效的内存。你实际上是在释放
q->tail


在其他地方,我怀疑你使用了
q->tail
,这会让你的操作系统发出尖叫,并像轮滑机上的地狱一样杀死你的程序。

问题是你在下一个代码行中指向了你要释放的东西:

q->tail=p;
...
free((void *) p);
现在,当您尝试访问q->tail时,会出现一个错误,因为您已经释放了这个内存

您应该尝试使用free p->next而不是p(因为p->next是您队列中的最后一项,所以这是您要取出的项)


祝你好运:)

问题是你在下一行代码中指向了你要释放的东西:

q->tail=p;
...
free((void *) p);
现在,当您尝试访问q->tail时,会出现一个错误,因为您已经释放了这个内存

您应该尝试使用free p->next而不是p(因为p->next是您队列中的最后一项,所以这是您要取出的项)

祝你好运:)

台词:

q->tail->next=NULL;
free((void *) p); 
…应该是

free( free( (void *) p->next );
p->next=NULL;
因为您并不是要释放“p”(这是您的新“tail”),而是要释放元素p->next,它是您的旧tail。释放指针后,将其设置为null。值q->tail已经指向'p',在之后释放'p'是无效的,因为'p->next'是您试图删除的

可能就是这样

另外,我个人不喜欢您将'Item'键入为void*的方式,因为'Item'看起来像堆栈上的传递值变量,所以它看起来很混乱

Kev

线路:

q->tail->next=NULL;
free((void *) p); 
…应该是

free( free( (void *) p->next );
p->next=NULL;
因为您并不是要释放“p”(这是您的新“tail”),而是要释放元素p->next,它是您的旧tail。释放指针后,将其设置为null。值q->tail已经指向'p',在之后释放'p'是无效的,因为'p->next'是您试图删除的

可能就是这样

另外,我个人不喜欢您将'Item'键入为void*的方式,因为'Item'看起来像堆栈上的传递值变量,所以它看起来很混乱


Kev

很抱歉,这无法编译。请提供您所引用的代码,不做任何修改。请删除对(void*)的强制转换,调用free()时不需要这些转换。很抱歉,这无法编译。请提供您所引用的代码,不做任何修改。请删除对(void*)的强制转换,调用free()时不需要这些转换。