我已经试着调试了好几个小时了。
我有一个调度程序的结构。
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,我不需要将值设置为null(
LinkedList* newLinkedList() {
LinkedList* newList = (LinkedList*)calloc(1, sizeof (LinkedList));
newList->head = NULL;
newList->tail = NULL;
newList->current = NULL;
newList->length = 0;
return newList;
}
在拔了很久头发之后,我注意到两个不相关的变量同时发生了变化。事实证明,调度器->cp和调度器->queue->tail似乎共享一个内存地址。
相同地址现象图片
这里,s是rr_scheduler指针。
任何可能的原因都将不胜感激。
sizeof rr
是指针的大小。但是您需要为结构分配足够的内存。使用
sizeof *rr
或
sizeof(rr_scheduler)
这样做。
在程序中,您没有为结构分配足够的内存,因此在块的末尾进行写入,从而损坏堆。
将rr
初始化为NULL
,然后立即分配给它,这似乎也很奇怪
rr_scheduler* rr = malloc(sizeof *rr);