@XTerris

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

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
JetBrains Санкт-Петербург
от 200 000 ₽
Verme Москва
от 120 000 ₽
AGIMA Москва
До 160 000 ₽
24 сент. 2020, в 09:09
2000 руб./за проект
24 сент. 2020, в 08:35
50000 руб./за проект
24 сент. 2020, в 08:23
10000 руб./за проект