Стек — это область памяти, используемая выполняемой программой для временного запоминания значений. При вызове функции все значения фактических параметров функции помещаются на стек. Затем запоминаются значения существенных регистров, таких как, например, указатель текущей команды. Значения регистров восстанавливаются при завершении управления вызванной функцией. При передаче управления вызванной функции значения фактических параметров связываются с соответствующими областями памяти на стеке, выделенными под формальные параметры. Затем определяется расположение на стеке для локальных (автоматических) переменных. Этот набор параметров, регистров и автоматических переменных для вызова функции называется кадром (frame). Если вызванная функция выполняет вызов другой функции, на стек помещается еще один кадр. Только один кадр является активным в любой момент времени. Активная часть стека "растет" при вызове функции и "сокращается" при выходе из функции. Стековое пространство все время повторно используется, и это является причиной того, почему автоматические переменные имеют до инициализации неопределенные значения. Они зависят от того, какие значения запоминались в соответствующем месте памяти до данного вызова функции.
Пример 1
int main()
{
   int x = 10, y = 100;
   f(5, 10);
. . .
}
double f (int x, int sum)
{
   double total;
   g(20.5);
. . .
}
float g(double val)
{
int count;
. . .
}
Показанная на рис. 1 диаграмма показывает гипотетическую систему построения стека. Компиляторы Си управляют стеком различными способами. Например, стек может расти от больших адресов к меньшим или наоборот; количество запоминаемых регистров зависит от системы; стековое пространство в некоторых системах может выделяться динамически по мере требований и т.д.
Рис. 1.  Диаграмма построения стека