Предполагая, что 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);