我遇到指针问题。基本上我有一个结构作为下面的链接列表队列Pcb
。
struct pcb {
pid_t pid; // system process ID
char * args[MAXARGS]; // program name and args
int arrivaltime;
int remainingcputime;
struct pcb * next; // links for Pcb handlers
int priority, memalloc, res1, res2, res3, res4, status;
};
typedef struct pcb Pcb;
typedef Pcb * PcbPtr;
现在您可以看到我已将Pcb
指针键入为PcbPtr
,这意味着PcbPtr
指针正确?
然后我实现了这些函数,将PcbPtr
添加到队列中,具体取决于其优先级:
PcbPtr enqPcb(PcbPtr headofQ, PcbPtr process){
PcbPtr c = headofQ;
if (!headofQ) {
headofQ = process;
return headofQ;
}
while (c->next) {
c = c->next;
}
c->next = process;
return headofQ;
}
void priEnq(PcbPtr f1, PcbPtr f2, PcbPtr f3, PcbPtr a) {
int pri = a->priority;
if (pri == 3)
enqPcb(f3, a);
else if(pri == 2)
enqPcb(f2, a);
else
enqPcb(f1, a);
return;
}
但它没有改变我指向的对象(即headf1
在这种情况下:)
PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(headf1, headf2, headf3, headi);
所以它好像我正在传递另一个对象作为参数。当我不使用priEnq()
时,它会很好地添加到列表中。
任何想法我做错了什么?非常感谢任何帮助
PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
PcbPtr c = *headofQ;
PcbPtr d = c;
if (!*headofQ) {
*headofQ = process;
return *headofQ;
}
while (c->next) {
c = c->next;
}
c->next = process;
return headofQ;
}
void priEnq(PcbPtr *f1, PcbPtr *f2, PcbPtr *f3, PcbPtr a) {
int pri = a->priority;
if (pri == 3)
enqPcb(f3, a);
else if(pri == 2)
enqPcb(f2, a);
else
enqPcb(f1, a);
return;
}
PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(&headf1, &headf2, &headf3, headi);
答案 0 :(得分:4)
如果我正确理解你的问题,priEnq
的调用者有指向队列的指针,如果函数改变队列的头部,则希望更新这些指针。
问题是你按值传递指针。如果希望被调用函数修改调用者的值,则必须通过引用传递,即指向要更新的指针的指针。在代码中:
PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
PcbPtr* c = headofQ;
if (!*headofQ) {
*headofQ = process;
return *headofQ;
}
while (c->next) {
c = c->next;
}
c->next = process;
return headofQ;
}
void priEnq(PcbPtr *f1, PcbPtr *f2, PcbPtr *f3, PcbPtr a) {
int pri = a->priority;
if (pri == 3)
enqPcb(f3, a);
else if(pri == 2)
enqPcb(f2, a);
else
enqPcb(f1, a);
return;
}
PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(&headf1, &headf2, &headf3, headi);
通过传递队列指针的地址,允许priEnq
修改指针,而不仅仅是它们自己的副本。
此外,正如sarnold所提到的,您可能需要考虑一组队列指针,以提高可读性和可维护性。