Я пытался отлаживать это часами.
У меня есть структура планировщика.
typedef struct rr_scheduler {
unsigned int time_q;
unsigned int avg_wait;
unsigned int avg_turnaround;
unsigned int processes_served;
unsigned int t;
unsigned int next_dispatch_t;
Process* cp;
LinkedList* queue;
LinkedList* done_list;
} rr_scheduler;
Он инициализируется так:
rr_scheduler* new_rr_scheduler(unsigned int time_q) {
rr_scheduler* rr = NULL;
rr = (rr_scheduler*)malloc(sizeof rr);
rr->time_q = time_q;
rr->queue = newLinkedList();
rr->done_list = newLinkedList();
rr->avg_wait = 0;
rr->avg_turnaround = 0;
rr->processes_served = 0;
rr->t = 0;
rr->next_dispatch_t = 0;
rr->cp = NULL;
return rr;
}
Вот функция инициализации linkedList. (Да, я знаю, что мне не нужно устанавливать нулевые значения, если я использую calloc)
LinkedList* newLinkedList() {
LinkedList* newList = (LinkedList*)calloc(1, sizeof (LinkedList));
newList->head = NULL;
newList->tail = NULL;
newList->current = NULL;
newList->length = 0;
return newList;
}
Потратив на это целую вечность, я заметил, что две несвязанные переменные изменились одновременно. Оказывается, scheduler->cp и scheduler->queue->tail имеют один и тот же адрес памяти.
Изображение одного и того же адреса
Здесь s — это указатель rr_scheduler.
Буду очень признателен за любые возможные причины этого.
calloc()
, но, возможно, вы добавили это только сейчас для ясности. - person Yirkha   schedule 13.05.2014