Почему и когда malloc () не будет доступен в C? - PullRequest
0 голосов
/ 12 сентября 2018

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

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

TL; DR:

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

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


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

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

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

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

0 голосов
/ 20 сентября 2018

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

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

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

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

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

0 голосов
/ 12 сентября 2018

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

...