【发布时间】:2018-12-14 16:52:59
【问题描述】:
我正在尝试重新编码 malloc 函数。
假设我们有一个这样的结构:
typedef struct s_block
{
char is_free;
size_t size;
struct s_block *next;
void *memory;
} t_block;
我用 mmap 分配一页内存,然后将它转换成一个大的 t_block。
然后,我有 1 个大小为 4064 的块(4096 - t_block 的大小)。
例如,如果我调用我的 malloc 大小为 12,这就是我所做的:
block->next = &block + 1 + size // Setting the next block
block->next->size = block->size - size - sizeof(t_block); // 4064 - 12 - 32
block->size = size; // 12
block->is_free = NOT_FREED;
block->memory = &block + 1;
block->next->memory = &(block->next) + 1;
block->next->next = NULL;
block->next->is_free = FREE;
我在使用 + 1 或 + sizeof(t_block) 时经常遇到问题。 那么,有什么区别:
block->next = &block + 1 + size;
和:
block->next = &block + sizeof(t_block) + size;
?
【问题讨论】:
-
这些陈述看起来都不正确。应该是
block->next = &block + sizeof(s_block),假设块是连续的。 -
&block + sizeof(block)将产生一个指向block地址加上sizeof(block)*sizeof(block)字节的指针。 -
但是很有可能这些块是不连续的,除非你将它们存储在一个数组中,这有点违背链表的目的。
-
@RobertHarvey 我不认为这些块是连续的 - 分配的内存看起来它可能位于 个块之间。这是错误的,因为它错误地假设
struct s_block没有对齐限制。 -
实际上块应该是连续的:|t_block metadata|___memory_asked___|t_block metadata|___memory_asked___|等等...下一个块的第一个块链接到下一个块,即位置&块+块元数据的大小+请求内存的大小。当我将它们放置在使用 mmap() 获得的内存页面中时,这些块应该是连续的
标签: c unix memory-management malloc mmap