C语言指针问题,急

来源:百度知道 编辑:UC知道 时间:2024/05/31 14:38:54
对于以下一个函数
void run(struct PCB *head)
{
...
while(time<=TOTALTIME)
{
...
struct PCB *runhead=(struct PCB*)malloc(sizeof(struct PCB));
struct PCB *p,*q;
runhead->next=runhead; /*循环链表*/
p=runhead;
q=p->next;
...
if(...)
{
...
struct PCB *tmp=q;
q=q->next;
p->next=q;
free(tmp);
/*我的意思是把这个p给释放了,让循环链表少一个结点*/
...
}
...
}
...
}
我想把这里的
struct PCB *tmp=q;
q=q->next;
p->next=q;
free(tmp);
写成一个函数,我写的是
void next(struct PCB *p,struct PCB *q) /*删除q*/
{
struct PCB *tmp=q;
q=q->next;
p->next=q;
free(tmp);
}
但我发现这样不对,但就是找不出为什么,应该怎么写才能真正的把p给释放了?
谢谢了.

应该用指针的指针,即二级指针。
void next(struct PCB **p,struct PCB **q) /*删除q*/
{
struct PCB *tmp=*q;
*q=*q->next;
*p->next=*q;
free(tmp);
}
因为你用一级指针只是相当于将原来的指针值拷贝到一个新的地方了,在函数里是实现了删除的,只是对调用函数来说,你传进来的指针值并没改变,它们仍指向原来的地方,而你已将那块内存给释放了。

函数加上返回指针struct PCB *应该就可以了吧