我有一个包含指针next的结构。我正在尝试建立一个结构队列,但是当我调用enqueue/dequeue时,我最终会遇到错误,试图写入信息;并且不知道这是否是enque/dequeue/insert造成的。只是学习C,对free/malloc不太确定,或者是否有必要。Insert基于int值(最小值优先)。
struct queue {
struct RCB* front;
struct RCB* back;
};
/*Initialize queue */
struct queue* new_queue(void){
struct queue* tmp = malloc( 1 * sizeof(tmp));
tmp->front = NULL;
tmp->back = NULL;
return tmp;
}
/*Add RCB to Queue FIFO */
struct queue* enqueue(struct queue* queue, struct RCB* rcb){
if(queue->front == NULL && queue->back == NULL){
queue->front = rcb;
queue->back = rcb;
printf("added front to queue\n");
return queue;
}
else {
queue->back->next = rcb;
queue->back = rcb;
printf("added to queue\n");
}
return queue;
}
/*Remove RCB from Queue FIFO */
struct RCB* dequeue(struct queue* queue){
struct RCB *tmp1 = (struct RCB *)malloc(sizeof(struct RCB));
struct RCB *tmp2 = (struct RCB *)malloc(sizeof(struct RCB));
if(queue->front == NULL && queue->back == NULL){
printf("queue is empty\n");
}
tmp1 = queue->front;
tmp2 = tmp1->next;
queue->front = tmp2;
if(queue->front == NULL){
queue->back = queue->front;
printf("removed rcb from queue\n");
}
return tmp1;
}
/*Insert RCB into Queue */
struct queue* insert(struct queue* queue, struct RCB* rcb){
if(queue->front == NULL && queue->back == NULL){
queue->front = rcb;
queue->back = rcb;
return queue;
}
if(queue->front->next == NULL){
queue->front->next = rcb;
return queue;
}
struct RCB *tmp = (struct RCB *)malloc(sizeof(struct RCB));
tmp = queue->front;
while(tmp->next->b2r < rcb->b2r || tmp->next == NULL){
tmp = tmp->next;
}
rcb->next = tmp->next;
tmp->next = rcb;
return queue;
}任何帮助都是非常感谢的。
发布于 2016-06-18 13:30:35
new_queue中,struct queue* tmp = malloc( 1 * sizeof(tmp));是错误的,因为这将分配一个具有指向struct queue的指针大小的缓冲区,而不是struct queue的大小,1*foo也根本没用。使用如下:
struct queue* tmp = malloc(sizeof(*tmp));dequeue中,您正在分配两个struct RCB缓冲区,同时通过将它们分配给指针tmp1 and tmp1 (这些不是必需的),从而立即失去对它们的引用,并且您正在创建内存泄漏。你需要的只是两个指针:
结构RCB* dequeue(struct *队列){ struct * tmp1;struct * tmp2;if(queue->前线== NULL & queue->back == NULL) { printf("queue is ==\n“);}tmp1=queue-> tmp2;tmp2= tmp1->next;queue->tmp1=tmp2;如果(queue-> == NULL) { queue->back =queue-> from;printf(“从队列\n中删除rcb”);}返回tmp1;}https://stackoverflow.com/questions/37897152
复制相似问题