Ты вот тут двигаешь куски кода зачем-то. Пока я совершенно не понимаю, что ты пытаешься изобрести, но я практически уверен, что ты делаешь это неправильно.
Фиг с ней, с ареной, просто запоминай офсет первого свободного байта после всего кода, данных или чего там у тебя ещё лежит, зачем ты в середину-то ползёшь? Адрес начала пустой области, адрес конца. Выделил — увеличил первый адрес. Это если освобождать не нужно. Если нужно освобождать, делаешь связный список блоков с маркером занят-не занят и размером, при выделении у кого-нибудь отрезаешь кусок, при освобождении склеиваешь рядом стоящие пустые блоки. Но это уже совсем не три строчки, и либо будет дикая фрагментация, либо работать будет медленно. Поэтому лучше попросить системный менеджер кучи сделать это правильно, его умные люди писали.