На какую область памяти (кучу или стек) ссылается указатель после вызова malloc в C/C++?

«На какую область памяти (кучу или стек) ссылается указатель после вызова malloc в C/C++?» — вопрос из категории Управление памятью, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Указатель, возвращённый 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), которые управляют памятью автоматически и безопасно.