@XTerris

Когда использовать malloc() или calloc()?

Читая статьи на Хабре, заметил, что там часто используются функции malloc() и calloc().
Они используются для выделения памяти.
Но и при простом определении переменной под нее также выделяется память.
Так в чем же существенное отличие этих двух способов?
Или эти 2 функции являются более гибким аналогом просто объявления переменной? (В том смысле, что программист сам решает размер выделяемой области)
Как понять, когда какой способ использовать правильнее?
  • Вопрос задан
  • 790 просмотров
Решения вопроса 1
bingo347
@bingo347
Crazy on performance...
Простая переменная выделяет память на стеке. Память на стеке должна быть фиксированного размера и известна в момент компиляции программы, иначе программа просто работать не будет.

malloc() и calloc() выделяют память на куче, она вполне себе может быть любого размера (не больше чем в системе есть свободной памяти конечно) и не обязательно знать ее размер в момент компиляции. На стеке будет только указатель, у которого фиксированный размер.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@cython
calloc используют для выделения памяти под массивы, он принимает 2 аргумента, кол-во элементов массива и размер одного элемента в байтах. malloc принимает 1 аргумент, это размер выделяемой памяти в байтах. По сути одно и тоже, но calloc заполняет выделенную память нулями, что убирает весь оставшийся мусор в выделенной памяти.
Ответ написан
Комментировать
xorknown
@xorknown
Будут проблемы - решайте
Если кратко, то во время выполнения программы есть две области памяти в которых можно выделять память.
Стек отличается скоростью выделения пространства для переменной, но ограничен по размерам и времени жизни самой переменной(Она уничтожается при выходе из области видимости). Следственно большие, долгоживущие объекты не всегда разумно создавать на стеке.
Куча же наоборот, более дорогая операция по времени выделения памяти, но время жизни переменных контролируешь ты сам и места там больше в среднем. Аллокаторы(malloc, calloc и т.п.) как раз выделяют память в куче.
Ответ написан
Комментировать
@TheCalligrapher
  • Первым и основным назначением динамической памяти является ручное управление временем жизни объектов. Память выделенная через malloc не подчиняется никаким автоматическим механизмам освобождения памяти. Такая память будет оставаться выделенной "вечно", пока вы сами не освободите ее вызовом free. Другими словами, в отличие от автоматических переменных, объекты, размещенные в динамической памяти, не уничтожаются при выходе из блока. Попросту выражаясь, динамическая память существует в первую очередь для того, чтобы вы могли ее выделить в функции, но не освобождать при выходе из этой функции.

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

  • Второе, не менее важное, важное свойство динамической памяти заключается в том, что количество и размер выделяемых блоков памяти определяется во время выполнения, а не на этапе компиляции. Ничего подобного нельзя получить через явное объявление переменных (за исключением, разве что, VLA)

  • Третье, чисто утилитарное, назначение динамической памяти - размещение объектов, которые просто-напросто слишком велики для других типов пямяти
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы