• Текст – Text.
  • Инициализированные данные — Initialized data.
  • Неинициализированные данные — Unitialized data.
  • Куча – Heap.
  • Стек – Stack.
  • Переменные среды — Environment variables.
Структура памяти программы - 1

На прошлой лекции мы рассмотрели программу для нахождения куба числа. Приведём её код ещё раз:

#include &ltstdio.h>

int cube(int input); //Прототип функции cube

int main(void)
{
     int x = 2;
     printf("x is %i\n", x);
     x = cube(x);
     printf("x is %i\n", x);
}

int cube(int input)
{
     int output = input * input * input;
     return output;
}

И на её примере рассмотрим структуру стека:

  • Локальные переменные cube()cube()'s locals
  • Параметры cube()cube()'s parameters
  • Локальные переменные main()main()'s locals
  • Параметры main()main()'s parameters
Структура памяти программы - 2

Когда вы вызываете функцию, ее параметры и локальные переменные располагаются в стеке выше той функции, в которой ее вызвали (cube () расположена выше main ()). Когда функция завершает работу, она передает результат функции, находится ниже в стеке.

Пример

Программа, меняет местами значения переменных x и y

#include &ltstdio.h>

int swap(int a, int b); //Прототип функции swap

int main(void)
{
     int x = 1, y = 2;
     swap(x, y);
     printf("x is %i\n", x);
     printf("y is %i\n", y);
}

void swap(int a, int b)
{
     int tmp = a;
     a = b;
     b = tmp;
}

Эта программа не работает так, как вы ожидаете: переменные x и y в программе не меняются. Это происходит потому, что в функции передаются копии значений переменных. Наберите эту программу, посмотрите на результат, и подумайте, почему он именно такой.