Где будут храниться адреса указателей в памяти? - PullRequest
0 голосов
/ 04 января 2019

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

Я знаю, что указатели, которые мы выделяем с помощью malloc, будут запрашивать кусок памяти в куче.Но когда мы вызываем системный вызов malloc (), он возвращает целое число в качестве адреса выделенного фрагмента памяти, но где этот адрес будет храниться сам?

Предположим,

int *ptr = malloc (16);

возвращает4008 адрес мем.и это начинается с 4008 до 4022. этот кусок в куче.но где само 4008?

хранится ли оно в стеке?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

В C существует три основных типа памяти для данных (исключая постоянные):

  • обычный, глобальный "data" * стек 1004 *
  • , используемый для локальных данных
  • куча, динамически управляемые данные

Первая область имеет фиксированный размер, определенный во время компиляции;все в нем является переменной, с адресом и размером.Вторая область, стек, похожа на первую: все, что хранится в ней, имеет имя, то есть является переменной.Отличие от локальных данных и глобальных данных заключается в том, что локальные данные существуют только при выполнении функции, а затем исчезают.Другими словами, каждая функция имеет свои локальные, временные данные, которые могут восприниматься точно так же, как глобальные данные, но исчезают.

Необходимо добавить две заметки.Во-первых, я написал «стек», потому что часто это стек, но это не обязательно;важно то, что это временно .Второе замечание: все, что программа делает или управляет, должно начинаться с переменной , которая находится в глобальных или локальных данных.Эти переменные являются воротами для всей другой памяти.

Самая интересная область - третья, куча.При запуске программы, вероятно, нет кучи (или она пуста).Чтобы использовать кучу, программа должна выделить («спросить») память из нее.Запрошенная память теперь «зарезервирована» для программы, которая должна хранить адрес (или «дескриптор») для этой области.Без сохранения адреса программа не сможет получить доступ к этой памяти.

Куча также является специальной, поскольку она является единственной областью, полностью управляемой программистом, а не компилятором.

Все всегда происходит от переменных .Так что вопрос «где будут храниться адреса указателей» может быть только один: в переменной.Если только он не был сохранен в самой куче, в области, доступной через указатель, который снова сохраняется в переменной в локальных или глобальных данных.

0 голосов
/ 04 января 2019

Учитывая ваш пример кода:

int *ptr = malloc(16);

Указатель ptr инициализируется возвращаемым значением malloc.Давайте предположим, что malloc возвращает 4008.Таким образом, значение из ptr становится 4008.В зависимости от компилятора это значение может в конечном итоге быть сохранено только в регистре, и в этом случае технически ptr не имеет адреса, но так как компилятор должен вести себя так, как если бы вы взяли адрес ptr (например, выражением &ptr, имеющим тип int **), указатель будет храниться в стеке с другими локальными переменными.Между тем, значения, на которые указывает ptr, будут сохранены по адресу, возвращенному malloc, в этом примере 4008.

...