TypeDefs和指针

时间:2012-06-07 01:41:38

标签: c pointers typedef

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

1 个答案:

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