2015-12-05 5 views
0

Я новичок в кодировании в c, и я не очень хорошо разбираюсь в указателях. Код компилируется отлично, но его запуск дает ошибку сегментации. Я сузил его до того места, где я создаю узлы (я думаю) в основном, но я не знаю, как это исправить. Любая помощь будет замечательной! Благодарю.Узлы, создающие ошибку сегментации

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

/* STRUCTURES */ 
struct Node 
{ 
    int id; 
    int at; 
    struct Node* prev; 
    struct Node* next; 
}; 

struct Queue 
{ 
    struct Node* head; 
    struct Node* tail; 
}; 


/* GLOBAL VARIABLES */ 
struct Queue* orderedArrival;   // holds original queue setup 
struct Queue* waitQueue;    // changeable copy of above 


/* METHODS */ 
void addByArrivalTimes(struct Node* process, struct Queue* queue); 
void printQueue(struct Queue* queue); 


/* MAIN */ 
int main() 
{ 
    orderedArrival = malloc(sizeof orderedArrival); 
    if (orderedArrival == NULL) 
     return 0; 

    waitQueue = malloc(sizeof waitQueue); 
    if (waitQueue == NULL) 
     return 0; 


    orderedArrival->head = orderedArrival->tail = NULL; 
    waitQueue->head = waitQueue->tail = NULL; 

    int i; 

    for(i = 0; i < 10; i++) //10 processes 
    { 
     struct Node* process; 
     process = malloc(sizeof *process); 
     process->next = NULL; 
     process->prev = NULL; 
     process->id = i; 
     process->at = rand()%10; 

     addByArrivalTimes(process, orderedArrival); 
    } 
    printQueue(orderedArrival); 

    return 1; 
} 


// Method is to put processes in order by arrival time 
void addByArrivalTimes(struct Node* process, struct Queue* queue) 
{ 
    // Queue is Empty 
    if(queue->head == NULL) 
    { 
     queue->head = process; 
     queue->tail = process; 
    } 

    // Queue is not Empty 
    else 
    { 
     struct Node* q = queue->tail; 
     struct Node* p = queue->head; 

     // Add at end 
     if(process->at > q->at) 
     { 
      queue->tail = process; 
      process->prev = q; 
      q->next = process; 
     } 

     // Add at beginning 
     else if(p->at > process->at) 
     { 
      queue->head = process; 
      process->next = p; 
      p->prev = process; 
     } 

     // Add in the middle 
     else 
     { 
      while(p->at < process->at) 
       p = p->next; 

      q = p->prev; 
      q->next = process; 
      p->prev = process; 
      process->prev = q; 
      process->next = p; 
     } 
    } 
} 

void printQueue(struct Queue* queue) 
{ 
    struct Node* p = queue->head; 
    while(p != NULL) 
    { 
     printf("Process: %d, Arrival Time: %d\n", p->id, p->at); 
     p = p->next; 
    } 
} 
+0

О, мой плохой, ошибка сегментации происходит, когда я звоню функцию addByArrivalTimes при создании узлов. Таким образом, это не сами Узлы. – smin18

ответ

1

В malloc вы используете sizeof на переменном не тип данных вам нужно изменить:

int main(int argc, char* argv[]) 
{ 
    orderedArrival = malloc(sizeof(struct Queue)); 
    if (orderedArrival == NULL) 
     return 1; 

    waitQueue = malloc(sizeof(struct Queue)); 
    if (waitQueue == NULL) 
     return 1; 
//... 
+1

Ответ Youir только наполовину прав. Допустимо использовать переменную как аргумент 'sizeof'. В некоторых случаях это даже желательно. 'sizeof (* p)' или 'n * sizeof (* p)' является полезной идиомой, которая действительна, даже если тип данных '* p' изменяется, но вы правы в том, что размеры неправильные, а ваш' mallocs' тоже хороши. (Как ни странно, OP правильно выбрал «процесс».) –