我一直试图调试这几个小时。
我有一个调度程序的结构。
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;
}
拔出头发多年后,我注意到两个不相关的变量同时发生了变化。 事实证明,scheduler-> cp和scheduler-> queue->尾部似乎共享一个内存地址。
Picture of same address phenomenon
这里,s是rr_scheduler指针。
非常感谢任何可能的原因。
答案 0 :(得分:4)
sizeof rr
是指针的大小。但是你需要为struct分配足够的内存。使用
sizeof *rr
或
sizeof(rr_scheduler)
这样做。
由于它在您的程序中,您没有为结构分配足够的内存,因此在块的末尾写入,从而破坏堆。
将rr
初始化为NULL
然后立即分配给它似乎很奇怪。我会把它写成
rr_scheduler* rr = malloc(sizeof *rr);