адреса стека и кучи - PullRequest
       2

адреса стека и кучи

6 голосов
/ 14 сентября 2011

Я пробовал простое выделение памяти в стеке и куче в C.

int x = 2;
int *y = malloc(sizeof(int));

Когда я смотрю адрес x в стеке и адрес кучи, содержащийся в y, я вижу следующее

x stack address : 0xbfe92bb4
heap address in y : 0x 9c4b008

Являются ли эти адреса в другом формате (поскольку я не вижу одинакового числа шестнадцатеричных символов в них обоих)?

Ответы [ 3 ]

5 голосов
/ 14 сентября 2011

В обычной программной модели есть три основных типа распределений:

  • Статический - в основном для глобальных / статических переменных - он выделяется при загрузке программы (обычно во время компиляции предопределенных адресов памяти, в зависимости от модели загрузки программы).
  • Куча - динамическое выделение (например, malloc или new), иногда может быть несколько «пулов памяти», из которых происходит выделение
  • Стек - в основном для локальных переменных и параметров функции

Два последних типа - это те, которые допускают какое-то динамическое распределение (реализованные и используемые очень разными способами), и они обычно либо выделяются из разных областей (что, особенно если поддерживается виртуальная память, может означать очень разные адреса ) или с разных концов одной и той же области (где распределение обоих видов памяти прогрессирует к середине).

В вашем случае это просто разные области памяти (адрес кучи, вероятно, должен читаться как 0x09c4b008, но 0 теряется в выводе).

4 голосов
/ 14 сентября 2011

Переменные хранятся в разных сегментах памяти.

Данные Область данных содержит глобальные и статические переменные, используемые программой, которые инициализируются. Этот сегмент может быть дополнительно классифицирован на инициализированную область только для чтения и инициализированную область чтения-записи. Например, строка, определенная 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 является общей для всех общих библиотек и динамически загружаемых модулей в процессе.

Продолжите свое расследование в Википедии

1 голос
/ 14 сентября 2011

malloc находится в куче, которая является областью памяти, отличной от стека.

Другой формат - это не разница в формате, а просто факт наличия памяти в пространстве процесса, что частично зависит от решения компилятора и ОС при выделении куча места для malloc.

См. Также этот вопрос , который имеет гораздо больше деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...