此代码已从实际版本中简化,以便于阅读,实际代码包含大量头文件并且数量巨大。
我有一个结构数组(进程),我有一个如下定义的指针Current。我想从数组中删除一个proc:
typedef struct proc proc;
typedef stuct proc *procPtr;
struct proc{
procPtr nextProc;
procPtr parentProc;
procPtr deadChildren;
char *name;
int pid;
};
int slot = 0 // the slot to operate on in the table
proc ProcTable[MAX];
procPtr Current;
proc null;
null.nextProc = NULL;
null.parentProc = NULL;
null.deadChildren = NULL;
strcpy(null.name, "Nil");
null.pid = -1;
/*Some code, table is populated with null procPtr*/
strcpy(ProcTable[slot].name, "Proc2");
ProcTable[slot].nextProc = NULL;
ProcTable[slot].deadChildren = NULL;
ProcTable[slot].parentProc = Current;
ProcTable[slot].pid = 2;
/* Some code, Current proc is switched to child and quitting*/
Current = &ProcTable[slot];
/* Remove the process from the table */
Current->parentProc->deadChildren = Current;
ProcTable[slot] = null;
printf("Process removed: Current points to %s,
ProcTable value: %s", Current->name, ProcTable[slot].name);
return;
这是回报:
>Process removed: Current points to Nil, ProcTable value: Nil
我所理解的是指针Current指向ProcTable中的值,但当我尝试从表中“删除”进程时,值正在被更改,值被覆盖。这是一个问题,因为我当时没有将死子进程的数据保存在其父列表中。
我该如何解决这个问题?如何在不覆盖数据的情况下从数组中“删除”进程当前指向的是什么?
答案 0 :(得分:0)
php artisan config:clear
是ProcTable
的数组,所以当你这样做时:
procs
您将Current->parentProc->deadChildren = Current;
ProcTable[slot] = null;
struct 复制到 null
覆盖旧的ProcTable[slot]
,这也会覆盖Current
,因为它指的是同样的事情。
编辑: 我想我现在明白了。这必须是家庭作业。您应该将该数组用作内存池,以便不必使用动态内存分配。但是您仍然需要使用链表结构。在这种情况下,当你需要'删除'一个proc并使它成为一个孩子时,只需重新启动指针,但不要从数组中删除。
答案 1 :(得分:0)
你的问题有点不清楚,但我会尽力回答。
首先,代码中有错误:
strcpy(null.name, "Nil");
没有为null.name分配内存,所以这会导致错误(如果你足够幸运的话)。
我理解您要做的是保留已移除的流程'当孩子被移除时,其父母的死孩子中的信息将被删除。
我建议使用一个列表,因为很明显这个数组用于" active"流程。你不能只指向数组,因为你对它做的任何更改都会反映到指向它的指针。
然后,您可以在活动进程列表中移动列表节点,进程的死子等等。
即使没有其他过程也会被写入"在进程被删除之后,在数组的位置上,你不能用一个数组来维护deadChildren链。
我希望这会有所帮助。如果没有,请说明进一步的问题。