我正在尝试对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/

10-11 16:45