Ответ
Указатель, возвращённый malloc (или calloc, realloc), ссылается на память, выделенную в куче (heap).
Ключевые отличия кучи от стека в контексте malloc:
| Характеристика | Память из malloc (Куча) |
Автоматическая память (Стек) |
|---|---|---|
| Время жизни | Контролируется программистом. Существует от malloc до free. |
Автоматическое. Уничтожается при выходе из области видимости. |
| Управление | Явное. Программист отвечает за выделение и освобождение. | Неявное. Компилятор вставляет код для управления стеком. |
| Размер | Ограничен объёмом виртуальной памяти ОС. Можно запросить большой блок. | Ограничен размером стека потока (обычно 1-8 МБ). |
| Скорость | Относительно медленнее (требуется поиск свободного блока, возможен вызов ОС). | Очень быстро (просто сдвиг указателя стека). |
| Фрагментация | Возможна внешняя и внутренняя фрагментация. | Нет фрагментации. |
Пример:
#include <cstdlib>
#include <iostream>
void stackAllocation() {
int onStack[100]; // Выделено в стеке. Уничтожится при выходе из функции.
// onStack = ...
} // Память для onStack автоматически освобождается здесь.
void heapAllocation() {
// Выделение в куче
int* onHeap = static_cast<int*>(malloc(100 * sizeof(int)));
if (onHeap == nullptr) { // Всегда проверяем результат!
// Обработка ошибки выделения памяти
return;
}
// Использование памяти...
onHeap[0] = 42;
free(onHeap); // ЯВНОЕ освобождение. Без этого — утечка памяти.
// onHeap теперь висячий указатель (dangling pointer).
}
int main() {
stackAllocation();
heapAllocation();
return 0;
}
Важно: В современном C++ для работы с кучей предпочтительнее использовать операторы new/delete или, что ещё лучше, умные указатели (std::unique_ptr, std::shared_ptr) и контейнеры STL (например, std::vector), которые управляют памятью автоматически и безопасно.