Стек содержит несколько кадров стека и хранится в памяти.
Каждый раз, когда вызывается функция, в стек добавляется новый кадр стека. Кадр стека содержит аргументы, которые должны быть переданы вызываемой функции, и адрес возврата, чтобы после завершения вызванной функции процессор знал, куда вернуться, чтобы он мог продолжить выполнение вызывающей функции. Кадр стека также может содержать память, которая будет использоваться локальными переменными вызываемой функции.
В этом примере функция Main с именем WriteCustomerDetails и функцией PrintToConsole записывают отдельные биты данных, которые искала функция WriteCustomerDetails:
'======= вершина стека ====================='
Функция: PrintToConsole
Арг: Джон Смит, 34 Акация Авеню, возраст 23
«------------------------------------------------- ---------- '
Функция: WriteCustomerDetails
Арг: Джон Смит
«------------------------------------------------- ---------- '
Функция: Главная
'====== Нижняя часть стека ==================='
Переполнение стека происходит, если достаточно места для стека не было зарезервировано. Обычно стек находится в одном большом непрерывном блоке памяти, поэтому не делится на куски, это означает, что для него требуется один большой кусок памяти, и это усложняет для среды выполнения попытку увеличить пространство, зарезервированное для стека. если он заполняется.
Переполнение стека может часто происходить, когда случайно пишется функция, которая вызывает себя. Иногда вполне нормально, чтобы функция вызывала себя до тех пор, пока в функции есть условие if или некоторое условие, которое останавливает вызовы в какой-то момент. Это называется рекурсивной функцией. Но если нет остановки, и функция продолжает вызывать себя, или, может быть, две или более функции продолжают вызывать друг друга, то очень быстро они сожрут всю память стека. Когда ничего не осталось, вы получаете переполнение стека и программа вылетает.
Это может произойти в любой программе, они не обязательно должны быть сложными, и это может происходить в коде, выполняющем веб-сайт. И это может происходить и в скриптовых языках.