在C中取消结构数组的索引,而不覆盖指针

时间:2015-09-21 13:04:24

标签: c arrays pointers struct process

此代码已从实际版本中简化,以便于阅读,实际代码包含大量头文件并且数量巨大。

我有一个结构数组(进程),我有一个如下定义的指针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中的值,但当我尝试从表中“删除”进程时,值正在被更改,值被覆盖。这是一个问题,因为我当时没有将死子进程的数据保存在其父列表中。

我该如何解决这个问题?如何在不覆盖数据的情况下从数组中“删除”进程当前指向的是什么?

2 个答案:

答案 0 :(得分:0)

php artisan config:clearProcTable的数组,所以当你这样做时:

procs

Current->parentProc->deadChildren = Current; ProcTable[slot] = null; struct 复制 null覆盖旧的ProcTable[slot],这也会覆盖Current,因为它指的是同样的事情。

编辑: 我想我现在明白了。这必须是家庭作业。您应该将该数组用作内存池,以便不必使用动态内存分配。但是您仍然需要使用链表结构。在这种情况下,当你需要'删除'一个proc并使它成为一个孩子时,只需重新启动指针,但不要从数组中删除。

答案 1 :(得分:0)

你的问题有点不清楚,但我会尽力回答。

首先,代码中有错误:

strcpy(null.name, "Nil");

没有为null.name分配内存,所以这会导致错误(如果你足够幸运的话)。

我理解您要做的是保留已移除的流程'当孩子被移除时,其父母的死孩子中的信息将被删除。

我建议使用一个列表,因为很明显这个数组用于" active"流程。你不能只指向数组,因为你对它做的任何更改都会反映到指向它的指针。

然后,您可以在活动进程列表中移动列表节点,进程的死子等等。

即使没有其他过程也会被写入"在进程被删除之后,在数组的位置上,你不能用一个数组来维护deadChildren链。

我希望这会有所帮助。如果没有,请说明进一步的问题。