Это продолжение Может ли массив char использоваться с любым типом данных?
Я знаю о динамической памяти и общих реализациях malloc, ссылки можно найти на wikipedia. Я также знаю, что указатель, возвращаемый malloc, может быть отброшен на все, что хочет программист, даже не предупредив, поскольку стандартные состояния в 6.3.2.3 Указатели §1
Указатель на void может быть преобразован в указатель или из указателя на любой неполный или объект тип. Указатель на любой неполный или тип объекта может быть преобразован в указатель на void и обратно; результат сравнивается с исходным указателем.
Вопрос заключается в том, что у меня есть автономная среда без malloc
и free
, как я могу построить в согласованном C реализацию этих двух функций?
Если я беру некоторую свободу относительно стандарта, это легко:
- начать с массива больших символов
- используйте достаточно большое выравнивание (8 должно быть достаточно для многих архитектур)
- реализовать алгоритм, возвращающий адреса из этого массива, при этом выравнивании, отслеживание того, что было выделено, - хорошие примеры можно найти в реализации malloc?
Проблема заключается в том, что эффективный тип указателей, возвращаемых этой реализацией, будет char *
И стандарт говорит в том же параграфе § 7
Указатель на объект или неполный тип может быть преобразован в указатель на другой объект или неполный тип. Если результирующий указатель неправильно выровнен для по типу, поведение undefined. В противном случае при обратном результат сравнивается с исходным указателем.
Это, похоже, не позволяет мне притворяться, что то, что было объявлено как простые символы, может магически содержать другой тип и даже разные типы в разных частях этого массива или в разные моменты в той же части. Говорят, что различие в разыменовании таких указателей кажется undefined поведением со строгой интерпретацией стандарта. Вот почему общие идиомы используют memcpy
вместо сглаживания, когда вы получаете байтовое представление объекта в строковом буфере, например, когда вы читаете его из сетевого потока.
Итак, как я могу построить совместимую реализацию malloc в чистом C???