【问题标题】:Malloc/calloc allocates an already allocated addressmalloc/calloc 分配一个已经分配的地址
【发布时间】:2014-07-01 09:23:30
【问题描述】:

我已经尝试调试了好几个小时。


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

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->tail 似乎共享一个内存地址。

Picture of same address phenomenon

这里,s 是一个 rr_scheduler 指针。

任何可能的原因将不胜感激。

【问题讨论】:

  • calloc() 之后不需要将内容初始化为 NULL/0 - 但也许您只是为了清楚起见才添加的。

标签: c pointers memory malloc calloc


【解决方案1】:
sizeof rr

是指针的大小。但是您需要为结构分配足够的内存。使用

sizeof *rr

sizeof(rr_scheduler)

这样做。

就您的程序而言,您没有为结构分配足够的内存,因此写入超出了块的末尾,从而破坏了堆。

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

rr_scheduler* rr = malloc(sizeof *rr);

【讨论】:

  • 我会做 sizeof (struct rr_scheduler) 但无论哪种方式他都没有分配足够的内存。
  • @ojblass sizeof *rr 更好,因为您不必重复类型名称,从而使代码更易于维护和清晰。
  • @FilipeGonçalves 这值得商榷。不是复制类型名称,而是复制变量名称。
  • 当然,但是复制变量名并不像复制类型名那么糟糕。看看stackoverflow.com/questions/373252/…
  • 如果使用变量名,可以在不破坏malloc()的情况下更改其类型
猜你喜欢
  • 2012-04-30
  • 2020-11-26
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多