Malloc / calloc分配已分配的地址

时间:2014-05-13 15:39:58

标签: c pointers memory malloc calloc

我一直试图调试这几个小时。


我有一个调度程序的结构。

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指针。

非常感谢任何可能的原因。

1 个答案:

答案 0 :(得分:4)

sizeof rr

是指针的大小。但是你需要为struct分配足够的内存。使用

sizeof *rr

sizeof(rr_scheduler)

这样做。

由于它在您的程序中,您没有为结构分配足够的内存,因此在块的末尾写入,从而破坏堆。

rr初始化为NULL然后立即分配给它似乎很奇怪。我会把它写成

rr_scheduler* rr = malloc(sizeof *rr);