【问题标题】:Creating a queue in C and Malloc when adding to the Queue添加到队列时在 C 和 Malloc 中创建队列
【发布时间】:2023-03-10 02:30:02
【问题描述】:

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

【问题讨论】:

    标签: c struct queue malloc


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-27
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        • 2021-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多