c双字段访问,为什么你有struct-> field_1-> field_2

时间:2015-11-29 21:02:07

标签: c

这是一个快速的问题,它可能是重复但我能找到它,

有人可以解释一下这行中发生的事情

  BlockPrefix_t *makeFreeBlock(void *addr, size_t size) { 
  BlockPrefix_t *p = addr;
  void *limitAddr = addr + size;
  BlockSuffix_t *s = limitAddr - align8(sizeof(BlockSuffix_t));
  p->suffix = s;
  s->prefix = p;
  p->allocated = 0;
  return p;
}

这是代码:

BlockSuffix_t *newBlock = (void *)r->suffix + requiredSize;
newBlock->prefix = r;
BlockPrefix_t *temp = (void *)newBlock + suffixSize;
temp->suffix = (void *)nextRegion->suffix;
temp->suffix->prefix = temp;

我不明白为什么双重访问?

3 个答案:

答案 0 :(得分:0)

我相信BlockPrefix_t是这样的:

typedef struct BlockPrefix_t {
    struct BlockPrefix_t* prefix;
    struct BlockPrefix_t* suffix;
} BlockPrefix_t;

如果是,则访问temp变量的sufix的前缀并为其分配temp。

答案 1 :(得分:0)

你必须阅读这样的一行:

(temp->suffix)->prefix = temp.

您正在将“temp-> suffix”指向的数据结构的字段“prefix”的值赋给temp本身。

答案 2 :(得分:0)

代码似乎是链接双向链表中的空闲块,可以从块的开头和块的末尾访问。这可能用于逐步合并空闲块。

发布BlockPrefix_tBlockSuffix_t的定义有助于确认此假设。