Устройство памяти

Стек программы
↓ - стек растёт вниз
старшие адреса
СЕГМЕНТ СТЕКА
Возможная "дыра" в адресном пространстве
СЕГМЕНТ ДАННЫХ
младшие адреса
Стек
Это область памяти, которая используется для хранения локальных переменных. Каждый раз, когда вы вызываете функцию, все её локальные переменные создаются в стеке. В переводе с английсткого stack - стопка. Здесь работает тот же принцип, что и со стопкой тарелок, - переменные добавляются при входе в функцию, а при выходе убираются. Странность заключается в том, что стек по сути перевёрнут вверх дном. Он начинается с верхней части памяти и "растёт" вниз.
Куча
Куча предназначена для динамической памяти - наборов данных, которые создаются во время работы программы и существуют продолжительное время.
Константы
Константы также создаются вместе с запуском программы, но они помещаются в память, предназначенную только для чтения. Константами могут быть, например, строковые литералы - они нужны для работы программы, но никогда не должны изменяться.
Глобальная память
Используется для хранения глобальных переменных. Глобальные переменные создаются при запуске программ и мы можем спокойно их изменять, но это нежелательно...
Код
Многие операционные системы размещают код в самой нижней части адресного пространства. Эта область также не предназначена для перезаписи. Это часть памяти, куда, в сущности, загружается скомпилированный код.