Переменные хранятся в разных сегментах памяти.
Данные
Область данных содержит глобальные и статические переменные, используемые программой, которые инициализируются. Этот сегмент может быть дополнительно классифицирован на инициализированную область только для чтения и инициализированную область чтения-записи. Например, строка, определенная char s [] = «hello world» в C и оператором C, например int debug = 1 вне «main», будет храниться в инициализированной области чтения-записи. А оператор C, такой как const char * string = "hello world", делает строковый литерал "hello world" для хранения в инициализированной области только для чтения, а переменную-строку указателя символов в инициализированной области чтения-записи. Пример: static int i = 10 будет храниться в сегменте данных, а global int i = 10 будет храниться в сегменте данных
Heap
Область кучи начинается в конце сегмента BSS и увеличивается оттуда к более крупным адресам. Область Heap управляется malloc, realloc и free, которая может использовать системные вызовы brk и sbrk для настройки своего размера (обратите внимание, что использование brk / sbrk и одной «области heap» не требуется для выполнения контракта malloc / realloc / free, они также могут быть реализованы с использованием mmap для резервирования потенциально несмежных областей виртуальной памяти в виртуальное адресное пространство процесса). Область Heap является общей для всех общих библиотек и динамически загружаемых модулей в процессе.
Продолжите свое расследование в Википедии