这是一个快速的问题,它可能是重复但我能找到它,
有人可以解释一下这行中发生的事情
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;
我不明白为什么双重访问?
答案 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_t
和BlockSuffix_t
的定义有助于确认此假设。