Работа с динамической памятью и указателями в системе Turbo Pascal. Мирецкий И.Ю - 3 стр.

UptoLike

Составители: 

1. Введение. Статические и динамические переменные
Все переменные, объявленные в программе, размещаются в одной непрерывной области опера-
тивной памяти, которая называется сегментом данных. Длина сегмента данных составляет 64К.
Для локальных переменных, описанных в подпрограмме, память отводится при вызове подпро-
граммы. При выходе из нее эта память освобождается, а сами переменные
прекращают свое существова-
ние. Глобальным переменным программы память отводится в начале ее выполнения. Эти переменные су-
ществуют в течение всего периода работы программы. Переменные, память под которые распределяется
описанным образом, называются статическими. Использование одних лишь статических переменных ли-
шает возможности писать программы, обрабатывающие достаточно большие информационные массивы.
Turbo Pascal дает возможность программисту
использовать для размещения переменных так назы-
ваемую "кучу" (heap) - динамическую память. Чтобы оценить размер и положение кучи в оперативной па-
мяти компьютера, рассмотрим карту памяти Turbo Pascal (см. рис. 1).
Префикс сегмента программы (Program Segment Prefix - PSP) -это 256-ти байтовая область, созда-
ваемая DOS при загрузке программы. Адрес сегмента PSP хранится в переменной PrefixSeg.
Каждый модуль (и главная программа, и каждый
модуль) имеет свой кодовый сегмент. Главная
программа занимает первый кодовый сегмент; кодовые сегменты, которые следуют за ним, занимают мо-
дули (в порядке, обратном тому, как они следовали в операторе uses), и последний кодовый сегмент за-
нимает библиотека времени выполнения (модуль System). Размер одного кодового сегмента не может
превышать 64К, но общий размер
кода ограничен только имеющейся памятью.
Верхняя граница памяти DOS
HeapEnd
свободная память
HeapPtr
куча (растет вверх)
HeapOrg OvrHeapEnd
оверлейный буфер
OvrHeapOrg
стек (растет вниз)
SSeg:SPtr
свободный стек
SSeg:0000
глобальные переменные
типизованные константы
DSeg:0000
кодовый сегмент модуля System
кодовый сегмент первого модуля
кодовый сегмент других модулей содержат образ
.EXE - файла
кодовый сегмент последнего
модуля
кодовый сегмент главной программы
префикс сегмента программы (PSP)
PrefixSeg
Нижняя граница памяти DOS
Рис. 1. Распределение памяти в Turbo Pascal.
                         1. Введение. Статические и динамические переменные
        Все переменные, объявленные в программе, размещаются в одной непрерывной области опера-
тивной памяти, которая называется сегментом данных. Длина сегмента данных составляет 64К.
        Для локальных переменных, описанных в подпрограмме, память отводится при вызове подпро-
граммы. При выходе из нее эта память освобождается, а сами переменные прекращают свое существова-
ние. Глобальным переменным программы память отводится в начале ее выполнения. Эти переменные су-
ществуют в течение всего периода работы программы. Переменные, память под которые распределяется
описанным образом, называются статическими. Использование одних лишь статических переменных ли-
шает возможности писать программы, обрабатывающие достаточно большие информационные массивы.
        Turbo Pascal дает возможность программисту использовать для размещения переменных так назы-
ваемую "кучу" (heap) - динамическую память. Чтобы оценить размер и положение кучи в оперативной па-
мяти компьютера, рассмотрим карту памяти Turbo Pascal (см. рис. 1).

                             Верхняя граница памяти DOS
HeapEnd
                                   свободная память
HeapPtr
                                   куча (растет вверх)
HeapOrg                                                                        OvrHeapEnd

                                  оверлейный буфер
                                                                                OvrHeapOrg

                                   стек (растет вниз)
SSeg:SPtr
                                    свободный стек
SSeg:0000
                                глобальные переменные

                                типизованные константы
DSeg:0000
                              кодовый сегмент модуля System

                              кодовый сегмент первого модуля


                             кодовый сегмент других модулей                    содержат образ
                                                                             .EXE - файла


                            кодовый сегмент последнего модуля

                            кодовый сегмент главной программы

                            префикс сегмента программы (PSP)
PrefixSeg
                             Нижняя граница памяти DOS

                              Рис. 1. Распределение памяти в Turbo Pascal.

        Префикс сегмента программы (Program Segment Prefix - PSP) -это 256-ти байтовая область, созда-
ваемая DOS при загрузке программы. Адрес сегмента PSP хранится в переменной PrefixSeg.
        Каждый модуль (и главная программа, и каждый модуль) имеет свой кодовый сегмент. Главная
программа занимает первый кодовый сегмент; кодовые сегменты, которые следуют за ним, занимают мо-
дули (в порядке, обратном тому, как они следовали в операторе uses), и последний кодовый сегмент за-
нимает библиотека времени выполнения (модуль System). Размер одного кодового сегмента не может
превышать 64К, но общий размер кода ограничен только имеющейся памятью.