想要在添加新节点时与社区核对在 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() 内部分配 Process 会更有意义。
关于添加到队列时在 C 和 Malloc 中创建队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35882303/