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

标签 c struct queue malloc

想要在添加新节点时与社区核对在 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/

相关文章:

c - 结构数组在最后一个索引处失败

c - 内存布局黑客

C 字段类型不完整

c++ - 函数调用中的 free struct 参数过多

java - MQ\Java - accessQueue() 方法 - openOptions 应该是什么以避免队列锁定

c - 从性能的角度来看有什么问题?

将文件名连接到目录名

C:分配给结构的空闲内存不起作用

Laravel 队列重试延迟

laravel - 将 Laravel 事件订阅者排队