c++进程调度算法指针赋值问题

问题遇到的现象和发生背景

C++的指针相互赋值,为什么一个指针给另一个指针赋值后就不能再给别的指针赋值了

用代码块功能插入代码,请勿粘贴截图
typedef struct PCBNode
{
    int ID;
    int Priority;
    int CPUtime;
    int Alltime;
    int Arrivetime;
    int state;
    int counter;
    struct PCBNode *next;
}PCB;


PCB *CreatPCB(int n)
{
    int i;
    PCB *p,*q;
    head=(PCB*)malloc(sizeof(PCB));
    head->next=NULL;
    p=head;
    p->Alltime=0;
    p->state=0;
    for(i=1;i<=n;i++)
    {
        if(i==1)
            head->next=p;
        q=(PCB*)malloc(sizeof(PCB));
        q->ID=i;
        q->CPUtime=0;
        q->Alltime=rand()%200;
        q->Arrivetime=rand()%100;
        q->Priority=rand()%10;
        q->state=0;
        p->next=q;
        q->next=NULL;
        p=q;

    }

    return head;
}//创建pcb块
int main(){

   int i,n,z=0;
scanf("%d",&n);
    PCB *oldd[4][n];
    head=CreatPCB(n);

        for(z;z1][z]=(PCB*)malloc(sizeof(PCB));
        if(z==0)
            *oldd[1][z]=*head->next;
        else
        {
            *oldd[1][z]=*oldd[1][z-1]->next;
            oldd[1][z-1]->next=oldd[1][z];
            }
        printf("\n%d,%d\n",1,z);
        }
Display(head);
    for(z;z2][z]=(PCB*)malloc(sizeof(PCB));
        if(z==0)
            *oldd[2][z]=*head->next;
        else
        {
            *oldd[2][z]=*oldd[2][z-1]->next;
            oldd[2][z-1]->next=oldd[2][z];
            }
        printf("\n%d,%d\n",2,z);
        }

        Display(head);
}
运行结果及报错内容

img

当head指向create函数的返回值时可以正常display,把head->next指向oldd[1][0]时也可以正常display,但是把head->next指向oldd[2][0]及之后的就不行了

我想要达到的结果

这是模拟操作系统的进程调度算法的其中一部分,我希望可以用一个二维数组odll[4][N]的每一行来将create(N)函数产生的结果复制一遍存到不同的地方,然后再使用四种不同的进程调度算法对每一行进行操作,来比较四种算法的优越性,但是用我的代码复制一次后就不能复制第二次了