3

我的指针有问题。基本上我有一个结构,它作为下面的链表队列工作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);
4

1 回答 1

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 所提到的,您可能需要考虑队列指针数组以提高可读性和可维护性。

于 2012-06-07T02:57:37.207 回答