添加到队列时在C和Malloc中创建队列

时间:2016-03-09 03:24:34

标签: c struct queue malloc

在添加新节点时,想要与社区核实在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;
    }
}

2 个答案:

答案 0 :(得分:1)

您的实现是正常的,如果在创建时分配,则不必在push_back()内部进行分配。 不要混淆新创建的Process的内存分配和指向新Process的指针的内存分配: 应该分配新创建的进程(在您的实现中,它应该在push_back()之外分配)。 在创建上一个Process时,已经分配了指向新Process的指针!指针本身(只有地址的大小)。

关于分配责任,即谁应该这样做或应该在哪里完成 - 如果push_back()参数是指向Process的指针,那么它将被这个函数的“用户”分配到外部更合理。在另一个实现中,您可以将push_back()参数定义为Process的内容,即pid。那么在push_back()中分配Process会更有意义。

答案 1 :(得分:0)

不,您不需要分配更多内存。内存已经分配;你的队列由指针组成。

这样做的一个问题是队列很可能不会在内存中连续布局。如果将内存分配留给队列实现,则可以控制分配内存的时间和位置,从而在访问元素时提供更好的性能。