Почему и когда malloc() не будет доступен в C?

Мне дали плату на базе 8051 со встроенной операционной системой. Я использую SDCC для создания приложений над ОС. И malloc недоступен, поэтому мне приходится выделять память статически. Это почему? Разве malloc не должен находиться в динамической библиотеке внутри компилятора?


person cleveraintwise    schedule 12.09.2018    source источник
comment
Соответствующий материал для чтения stackoverflow.com/questions/30825151/   -  person StoryTeller - Unslander Monica    schedule 12.09.2018
comment
Нельзя выделить то, чего нет...   -  person M.M    schedule 12.09.2018
comment
malloc является частью стандартной библиотеки, а не частью компилятора. Поэтому ваша плата должна предоставлять библиотеку, реализующую malloc.   -  person Paul Ogilvie    schedule 12.09.2018
comment
В системах с очень небольшим объемом оперативной памяти динамическое выделение памяти в большинстве случаев не имеет особого смысла.   -  person Jabberwocky    schedule 12.09.2018
comment
Во времена старых консолей (PS2 и ранее) было обычным делом выделять всю память из ОС при запуске, а затем просто использовать память по адресу для вашей игры из созданной вручную карты памяти в электронной таблице.   -  person Retired Ninja    schedule 12.09.2018
comment
Если это облегчит вам жизнь, вы можете зарезервировать кусок памяти и написать простые malloc и free для управления этим куском.   -  person Paul Ogilvie    schedule 12.09.2018
comment
@PaulOgilvie возвращает 8-битный указатель на массив битов? :)   -  person Martin James    schedule 12.09.2018
comment
@PaulOgilvie доска, правда?   -  person tilz0R    schedule 12.09.2018


Ответы (3)


TL;DR:

Почему и когда malloc() не будет доступен в C?

Единственное, что можно сказать в целом, это то, что malloc() будет предоставляться каждой соответствующей реализацией C, размещенной на хосте, но есть и другие виды, в том числе другой соответствующий вид.


Разве malloc не должен находиться в динамической библиотеке внутри компилятора?

Не совсем. malloc() является частью стандартной библиотеки C, поэтому она предоставляется каждой соответствующей размещенной реализацией C. Реализация C включает систему для перевода исходного кода C в исполняемые программы, а также механизм и среду для запуска полученных программ. Первый обычно вращается вокруг компилятора. Последний включает в себя столько стандартной библиотеки C, сколько предоставляет реализация, и эта часть находится там, где находится malloc, если она доступна. Таким образом, нет, malloc технически не является частью компилятора.

Я уверен, что это не различие, которое вы хотели указать, но оно имеет отношение к ответу. Обратите внимание: я сказал, что malloc обеспечивается реализациями hosted. Это то, с чем вы обычно сталкиваетесь в операционных системах общего назначения. Они создают программы, которые стандартно запускаются через хост-ОС, и предоставляют все возможности стандартной библиотеки C в связке с ОС. Но есть и автономные реализации. Одно из ключевых отличий заключается в том, что автономные реализации освобождаются от предоставления большей части стандартной библиотеки, включая malloc().

Обычно вы найдете автономные реализации, используемые для встроенных систем, таких как ваша. Они также используются для ядер ОС, загрузчиков и других подобных программ, а не работают непосредственно на «голом железе». То, что ваши программы работают поверх ОС, делает вашу среду чем-то вроде Cadillac среди встраиваемых систем, но не гарантирует, что реализация C является размещенной. Поскольку он не предоставляет malloc, он не может быть соответствующей размещенной реализацией, но может быть соответствующей автономной реализацией. Он должен документально подтвердить, за что он себя выдает. Если он автономный, но предоставляет другие стандартные библиотечные функции, вы можете считать это роскошью.

person John Bollinger    schedule 12.09.2018
comment
@cleveraintwise, нет, если реализация не утверждает, что она является соответствующей размещенной реализацией, небезопасно предполагать, что malloc() будет доступен для программ в среде выполнения. Период. Не существует ни одной библиотечной функции, для предоставления которой стандарт C требует автономных реализаций, даже malloc(), и стандарт вообще не предъявляет никаких требований к несоответствующим реализациям. Нет никакой замены для чтения документации по вашей реализации, по крайней мере, достаточной, чтобы проверить, утверждает ли она, что она соответствует требованиям, размещенным на хостинге. - person John Bollinger; 12.09.2018
comment
Я бы, если бы он был. - person cleveraintwise; 12.09.2018
comment
@cleveraintwise, без какой-либо документации у вас вообще нет основы для того, какой код вы можете или должны написать. Даже если документация означает сарафанное радио от человека, ответственного за реализацию C, у вас должно быть что-то для выполнения любой работы. - person John Bollinger; 12.09.2018

Некоторые рекомендации для систем, критически важных с точки зрения безопасности, не допускают динамического выделения памяти.

Например, в руководстве MISRA C:2004 есть следующее правило:

20.4 — Динамическое выделение памяти кучи не должно использоваться.

Один из способов следовать этому правилу: не привносить и не внедрять в систему malloc() и другие функции динамического выделения памяти.

Такие системы обычно представляют собой встроенные системы, где потребности в памяти хорошо известны/ограничены во время или до времени компиляции. Таким образом, можно безболезненно избежать динамического выделения памяти.

person SKi    schedule 20.09.2018

С библиотеками C, включенными в ваш проект, вы можете использовать такие функции, как malloc, printf и т. д. Поймите, что 8051 — это устройство печати с малым объемом памяти, порядка нескольких КБ. Следовательно, включение библиотек C увеличит размер выходного файла .hex, и вам не хватит памяти.

person Javeed Shariff    schedule 12.09.2018
comment
Проблема в оперативной памяти. Если нет пространства XDATA,. malloc () и т. д. - это ммм ... «лучше избегать» на 8051. - person Martin James; 12.09.2018
comment
На самом деле, даже если есть ОЗУ XDATA, malloc () и т. Д. Ммм ... «лучше избегать» на 8051. - person Martin James; 12.09.2018
comment
На самом деле отказ от 8051 вовсе не является неразумным подходом ;) - person Martin James; 12.09.2018