TGViewer
METANIT.COM METANIT.COM @devnull22 · 5.81K subscribers
Post #1746 1.96K
Организация памяти программы на C и структура сегментов (описание к картинке из предыдущего поста)

Структура памяти программы на языке C имеет чётко определённое устройство, которое организует различные типы данных и кода в отдельные сегменты в адресном пространстве процесса.

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

Сегмент стека располагается в верхней части структуры памяти и растёт вниз при вызовах функций и создании локальных переменных. Этот сегмент содержит все локальные переменные, параметры функций и адреса возврата. При каждом вызове функции создаётся новый фрейм стека, который хранит её локальные данные.

В данном примере (картинка из предыдущего поста) сегмент стека хранит локальный массив x, содержащий значения {1, 7, 3}, а также такие переменные, как result, f и q, которые существуют в области видимости соответствующих функций.

Стек работает по принципу last-in-first-out (последним пришёл — первым ушёл), автоматически управляя выделением и освобождением памяти при вызовах и возврате функций. Когда выполняется функция main, она создаёт пространство для массива x и переменной result, в то время как функция f создаёт собственный фрейм стека, содержащий локальную переменную q, инициализированную значением 7.0.

Такое автоматическое управление памятью делает стек эффективным для временного хранения данных, но ограничивает время жизни переменных областью их видимости.

Сегмент динамической памяти (heap) предоставляет возможности динамического распределения памяти, хотя в этом простом примере он не используется. Расположенный между стеком и нижними сегментами памяти, heap растёт вверх и позволяет программам запрашивать память во время выполнения с помощью функций malloc() и free().

Сегмент констант и глобальных переменных
хранит переменные, которые существуют на протяжении всего выполнения программы, например, глобальную переменную size со значением 3. Этот сегмент обычно содержит инициализированные глобальные переменные, статические переменные и строковые литералы, которые должны оставаться доступными из нескольких функций или на протяжении всего времени существования программы.

Сегмент кода располагается в нижней части структуры памяти и содержит скомпилированные машинные инструкции для всех функций программы. Этот сегмент обычно доступен только для чтения, чтобы предотвратить случайное изменение программного кода во время выполнения.

Функция f (картинка из предыдущего поста) демонстрирует простую реализацию, которая всегда возвращает значение 7.0 с помощью локальной переменной q, в то время как функция main организует поток программы, инициализируя массив, вызывая функцию f и сохраняя возвращённое значение.

Организация памяти обеспечивает хранение каждого типа данных в соответствующем сегменте на основе его области видимости, времени жизни и шаблонов использования, обеспечивая эффективность и безопасность выполнения программы.

https://metanit.com/c/tutorial/5.18.php
  • 👍 8
  • ❤ 5
  • 👏 1
More from @devnull22
  1. Mar 19, 2026Добавил в руководство по JavaScript главу про работу с датами и временем с помощью Tempora…
  2. Mar 19, 2026Роскомнадзор перестал полностью справляться с блокировками в интернете Роскомнадзор (РКН)…
  3. Mar 18, 2026Минцифры опубликовало законопроект о государственном регулировании ИИ. Закон должен начать…
  4. Mar 18, 2026Microsoft призвала разработчиков создавать ИИ-приложения в Electron на Windows 11 Microsof…
  5. Mar 18, 2026Oracle анонсировала проект Detroit, который будет развиваться в составе OpenJDK и нацелен…
  6. Mar 17, 2026Вышла новая версия платформы Java - JDK 26. JDK 26 — краткосрочная версия с поддержкой Pre…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →