free函数为什么不能释放动态分配的内存

发布网友 发布时间:2022-04-24 12:25

我来回答

3个回答

热心网友 时间:2023-10-12 19:20

如果p=NULL时,你用free释放是不会成功的
在你的程序中你最后使得free(q)中的q恰好就是NULL,所以释放失败
原因在于Delete函数中的
else
{
while(j < i-1&&p != NULL)
{
p = p->pNext;
j++;
}
if(j >= i||p ==NULL)
{ exit(-1); return; }
q = p->pNext;
p->pNext = p->pNext->pNext;
*e = q->data;
free(q);
当j不再小于i-1即恰好j ==i -1时循环结束(要记住在循环体里面还有个j++),此时的p不会等于NULL,但是p->Next==NULL,所以后面的if条件不成立,就进入了后面的q = p->pNext; 此时释放q必然是失败的。

热心网友 时间:2023-10-12 19:21

本身没错,你的程序如果删除大于4个结点链表也没问题,
问题是小于4个结点时,p->next有可能是0,你的p->pNext = p->pNext->pNext就出错了。

热心网友 时间:2023-10-12 19:21

该为下述代码再看看,原来代码显得“乱”。

void Delete(PNODE pHead, int i,int *e) {
PNODE q,p = pHead;
int pos = 1;
if(i < 1) return;
while(pos < i && p->pNext) {
p = p->pNext;
++pos;
}
if(pos == i) {
q = p->pNext;
p->pNext = q->pNext;
free(q);
}
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com