2016-06-18 5 views
1

포인터가 포함 된 구조체가 있습니다. next. 구조체의 대기열을 만들려고하지만 enqueue/dequeue을 호출하면 결국 정보를 쓰려고하는 중 오류가 발생합니다. enque/dequeue/insert으로 인한 것인지 여부를 알 수 없습니다. 단지 C를 배우고 free/malloc 또는 그것이 필요한지 확실하지 않습니다. 삽입은 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; 
    } 

어떤 도움을 주시면 감사하겠습니다. 이 대신 struct queue의 크기, struct queue 포인터의 크기의 버퍼를 할당하기 때문에 new_queue에서

+3

'의를 sizeof (TMP)'그것이 가리키는 어떤 * 포인터 *의 크기의이 아니라, 잘못된 것입니다. 대신에'sizeof (* tmp)'를 사용해야합니다. –

+0

감사합니다! 여전히 포인터에 대해 알고 있습니다 –

+0

'dequeue '에있는 두 개의'malloc'이 유출되었습니다. – fluter

답변

3
  1. Do not cast malloc return value

  2. , struct queue* tmp = malloc(1 * sizeof(tmp)); 잘못도 1*foo 것은 전혀 도움이되지 않습니다. 사용 다음 dequeue에서

    struct queue* tmp = malloc(sizeof(*tmp)); 
    
  3. , imediately 포인터 tmp1 and tmp1에 할당함으로써 그들에 대한 참조를 잃는 동안 struct RCB의 두 개의 버퍼를 할당하는, 사람들은 필요하지 않습니다, 당신은 메모리 누수를 만들 수 있습니다. 당신이 필요로하는 것은 두 포인터 :

    struct RCB* dequeue(struct queue* queue) { 
         struct RCB *tmp1; 
         struct RCB *tmp2; 
         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; 
    } 
    
관련 문제