История вопроса:
Стековая память присутствует во всех основных архитектурах. В языке C автоматические (local) переменные размещаются на стеке, обеспечивая высокую скорость выделения и освобождения памяти по сравнению с динамической кучей.
Проблема:
Использование стека ограничено по размеру, автоматические переменные автоматически уничтожаются после выхода из блока, а выход за пределы стека (stack overflow) приводит к аварийному завершению программы или повреждению данных.
Решение:
Локальные переменные, объявленные внутри функций без специального модификатора, размещаются на стеке. Эта область автоматического хранения создаётся при входе в функцию и уничтожается при выходе. Размер стека ограничен и может быть изменён лишь опциями компоновки/системы.
Пример кода:
#include <stdio.h> void foo() { int arr[100]; // размещено на стеке for (int i = 0; i < 100; ++i) arr[i] = i; printf("First element: %d ", arr[0]); } // arr уничтожается после выхода из foo
Ключевые особенности:
Можно ли вернуть локальную переменную из функции по адресу?
Нет, потому что переменная уничтожается после выхода из функции, а получившийся "висячий указатель" приводит к неопределённому поведению.
int* bad() { int x = 42; return &x; // ошибка: возвращённый указатель указывает на освобождённый стек }
Возможно ли разместить большой массив (например, 1 МБайт) на стеке?
Для большинства систем стек ограничен (от десятков до сотен Кбайт). Попытка объявить огромные массивы на стеке приведёт к stack overflow.
В чём разница между static и автоматическими переменными при размещении?
static-переменные (даже в функции) размещаются в статической области памяти, не очищаются между вызовами, а автоматические — на стеке и уничтожаются при выходе из блока.
В функции для вычислений выделяли массив 8192*1024 double на стеке. Программа получала SIGSEGV при запуске в Linux, хотя компилировалась без ошибок.
Плюсы:
Минусы:
Для работы с крупными буферами использовали динамическое выделение памяти через malloc/free. На стеке размещались только небольшие рабочие переменные.
Плюсы:
Минусы: