Всем привет! Разбираюсь с устройством аллокации памяти в Си, рассматриваю реализацию malloc и free из книги Кернигана и Ритчи.
Текущая задача – модифицировать код до функционала calloc. Задавал свой вопрос в чат для маслят, но не получил никакого ответа, поэтому пытаю счастье здесь.
Первое изменение находится в формуле nunits: теперь число запрашиваемых байтов определяется как произведение параметров ncells и cellsize.
Перед самым возвратом из функции аллокации я организовал цикл, число итераций в котором равно количеству затребованных ячеек, т.е. ncells. Блок памяти приводится к типу char, чтобы в конце каждой итерации его увеличение на cellsize приводило к смещению на число байт указанного типа. Ну, и в теле цикла просто кладём по адресу нули.
И вот какая странность. Я запускаю код на смартфоне (неплохое начало, да?), и в разных средах – разный результат. C4droid ругается в момент первого обращения к выделенной памяти внутри главной функции, а Cxx просит добавить явное приведение адреса, возвращаемого внутри morecore вызовом sbrk, и после этого работает без ошибок.
С чем именно связано это расхождение? Как создать универсальный вариант этой функции с той лишь оговоркой, что данная реализация изначально поддерживается на тех машинах, где допустимо сравнение указателей, полученных от разных системных вызовов?
https://pastebin.com/i2QwmfV4