我正在尝试对malloc函数重新编码。
假设我们有这样一个结构:
typedef struct s_block
{
char is_free;
size_t size;
struct s_block *next;
void *memory;
} t_block;
我用mmap分配一页内存,然后把它转换成一个大的t}u块。
然后,我有一个大小为4064的块(4096-t_块的大小)。
例如,如果我将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
被声明为t_block *
并且您希望在这个块和下一个块之间有size
字节,那么您所期望的也不是。因为&block
是指针的地址,所以对它执行的任何指针运算都基于指针的大小,而不是结构的大小。
你真正想要的是:
block->next = (t_block *)((char *)block + sizeof(t_block) + size);
通过首先将
block
强制转换为char *
,对其执行的任何指针算法都只处理单个字节,而不是结构大小的倍数。因此,我们从块的地址开始,向上移动sizeof(t_block)
字节到用户内存的开头,然后向内存的结尾和下一个块的开头移动size
更多字节。另外,由于结构的对齐要求,需要确保下一个块正确对齐。你可以这样做:
size_t block_align = (sizeof(t_block) - (size % sizeof(t_block))) % sizeof(t_block);
block->next = (t_block *)((char *)block + sizeof(t_block) + block_align + size);
关于c - &address + sizeof(type)和&address + 1有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53783904/