Рис. 1.  
Диаграмма на рис. 1 показывает виртуальную память пользователя. Она организована из трех сегментов: текст, данные и стек.
Текстовый сегмент – это просто выполняемый код, то есть машинный код программы.
Сегмент данных используется для хранения внешних (external) и статических (static) переменных. Он содержит инициализированные и неинициализированные данные. Неинициализированные данные автоматически устанавливаются равными нулю при входе в программу. Адрес внешней памяти etext обозначает конец текстового сегмента. Конец инициализированных и неинициализированных данных обозначен адресом внешних переменных edata и end, соответственно. Переменные etext, edata и end – целые.
Первоначально, граница выделяемой памяти программы – это адрес end. Граница выделяемой памяти может изменяться при вызове системных вызовов или библиотечных функций управления памятью. Однако адреса трех переменных etext, edata и end неизмены.
Стек программы используется для хранения аргументов функции и ее локальных (automatic) переменных. Стек также используется для сохранения регистров при вызове функции. Расположение вершины стека труднодоступно.
Любая попытка исправить память между концом данных и вершиной стека может привести к порче памяти. Также недоступна память расположенная ниже конца стека.
Можно изменить размер сегмента данных с помощью системных вызовов brk и sbrk, изменяя границы выделяемой области.
В отличие от сегмента данных, стек программы автоматически увеличивается и уменьшается с каждым вызовом функции и выходом из нее, соответственно.