想在添加新节点时与社区核实在 C 和 malloc
中实现队列的情况。
当我在代码中创建node
/process
时,我会在创建进程时分配内存。 但是,当我查看队列的各种实现时,我注意到当添加到队列时,即 void push_back(struct*);
,我注意到一些实现在将新节点添加到队列尾部时会分配/malloc
。 如果我在创建struct
时已经分配了动态内存,那么在调用函数push_back(struct*)
时是否需要malloc
空间? 我下面的例子没有。
typedef struct process{
int pid;
struct process* next;
} Process;
typedef struct Queue{
Process* head;
Process* tail;
}Queue;
void push_back(Queue *q, Process *p){
p->next = NULL;
if( q->head == NULL && q->tail ==NULL){
q->head = q->tail = p;
}
else {
q->tail->next = p;
q->tail = p;
}
}
你的实现是可以的,如果你在创建时分配,你不必在 push_back() 中分配。不要混淆新创建的进程的内存分配和将指向新进程的指针的内存分配:应该分配新创建的进程(在您的实现中,它应该在 push_back() 之外分配)。在创建上一个进程时,将指向新进程的指针已经分配!指针本身(仅地址的大小)。
关于分配责任,即谁应该这样做或在哪里做 - 如果 push_back() 参数是指向 Process 的指针,那么由这个函数的"用户"在外面分配它更合理。在另一个实现中,您可以将 push_back() 参数定义为仅 Process 的内容,即 pid。那么在 push_back() 中分配进程会更有意义。
不,您不需要分配更多内存。内存已分配;您的队列由指针组成。
这样做的一个问题是队列很可能不会在内存中连续布局。如果将内存分配留给队列实现,则可以控制分配内存的时间和位置,从而在访问元素时获得更好的性能。