### Память процесса Стандарт C не определяет, как должна быть организована память для запущенных программ, но типичный процесс, то есть запущенная программа, может выглядеть так ![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/pointers1.jpg) В самом низу, есть код, который запускает процесс. Код - это данные, инструкции, которым должен следовать процессор, и это часть памяти процесса. Кроме того, данные, которые существуют на протяжении всего срока службы процесса. Когда вы объявляете глобальные переменные, они живут до тех пор, пока выполняется программа, и именно здесь они находятся в памяти. Некоторые из этих данных будут доступны только для чтения. В программе определены константы, которые нельзя изменить. Строковые литералы, обычно они неизменяемы, они хранятся в памяти, доступной только для чтения, и ваша программа может выйти из строя, если вы попытаетесь их изменить. Глобальные переменные, которые вы определяете сами, если они не объявлены const, являются изменяемыми, и вы можете записывать в них. Кроме того есть память, которую программа выделяет (и освобождает) во время выполнения. Эту область памяти называют кучей. Когда процессу требуется больше памяти, куча растет вверх. Когда он избавляется от памяти, ситуация становится более сложной. Мы не удаляем блок посередине и не перемещаем все данные над ним вниз, это отнимет много времени, и мы не можем перемещать объекты, адрес которых у нас есть - тогда они бы переместились, и поэтому доступ к данным через адрес не будет работать. Однако не волнуйтесь, это то, с чем C справится за вас. Вверху у нас есть стек. Стек обрабатывает вызовы функций, и именно в нем находятся локальные переменные и аргументы функций. Обычно он растет вниз. Между стеком и кучей обычно существует барьер, часть памяти, доступ к которой вам запрещен. Это делается для того, чтобы предотвратить перерастание стека и кучи друг в друга. Память, которую видит процесс, редко является физической памятью, имеющейся у компьютера. Между запущенным процессом и физической памятью центральный процессор создает “виртуальную” память. Это пространство памяти, с которым работает программа, и каждый раз, когда ей требуется доступ к памяти, аппаратное обеспечение сопоставляет виртуальный адрес с физическим. Виртуальная память защищает процессы друг от друга и обеспечивает более простой адресный интерфейс для программ.