在添加新节点时,想要与社区核实在C和malloc
中实施队列。
当我在代码中创建node
/ process
时,我会在创建流程时分配内存。但是,当我查看队列的各种实现时,我注意到在添加到队列即void push_back(struct*);
时,我注意到在向域添加新节点时,某些实现会分配/ malloc
。队列的尾巴。如果我已经在创建struct
的位置分配了动态内存,那么在调用函数malloc
时是否需要push_back(struct*)
空格?我的例子不是。
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;
}
}
答案 0 :(得分:1)
您的实现是正常的,如果在创建时分配,则不必在push_back()内部进行分配。 不要混淆新创建的Process的内存分配和指向新Process的指针的内存分配: 应该分配新创建的进程(在您的实现中,它应该在push_back()之外分配)。 在创建上一个Process时,已经分配了指向新Process的指针!指针本身(只有地址的大小)。
关于分配责任,即谁应该这样做或应该在哪里完成 - 如果push_back()参数是指向Process的指针,那么它将被这个函数的“用户”分配到外部更合理。在另一个实现中,您可以将push_back()参数定义为Process的内容,即pid。那么在push_back()中分配Process会更有意义。
答案 1 :(得分:0)
不,您不需要分配更多内存。内存已经分配;你的队列由指针组成。
这样做的一个问题是队列很可能不会在内存中连续布局。如果将内存分配留给队列实现,则可以控制分配内存的时间和位置,从而在访问元素时提供更好的性能。