Расположение указателей и глобальных переменных в C - PullRequest
13 голосов
/ 25 июня 2010

Где указатели и глобальные переменные хранятся в C ? Они сохранены в памяти, куче или стеке?

Ответы [ 5 ]

25 голосов
/ 25 июня 2010

Глобальные переменные могут находиться в нескольких местах, в зависимости от того, как они настроены - например, глобалы const могут находиться в секции только для чтения исполняемого файла.«Нормальные» глобалы находятся в секции чтения-записи исполняемого файла.Их нет ни в куче, ни в стеке.Указатели - это просто тип переменных, поэтому они могут быть там, где вы хотите, чтобы они были (в куче, если вы их malloc(), в стеке, если они локальные переменные, или в разделе данных, если они глобальные)..

8 голосов
/ 25 июня 2010

Компиляция

Когда файл компилируется, переменные с «продолжительностью программы» (статические или глобальные переменные), которые определены в этой «единице компиляции» (в грубом выражении, «файл c»), определяют, каксколько глобального пространства нужно этой программе, и как она инициализируется.

Ссылка

Когда компоновщик создает ваш исполняемый файл, он объединяет эту информацию и помещает ее в разделы исполняемого файла, используемые для этой цели.Затем компоновщик просматривает и изменяет все ссылки на эти данные, чтобы поместить их в область памяти процесса при загрузке программы.Таким образом, указатели на глобальные данные будут похожи на константы в вашем исходном файле;для них не нужно выделять память.

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

Load

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

Динамические библиотеки

Если ваш код находится в динамической библиотеке, компоновщик не может знать, где онпоставит глобальные данные.В этом случае он создает разделы в библиотеке, чтобы сообщить ей, где находятся ссылки на глобальные данные, а загрузчик позаботится об изменении ссылок, чтобы они указывали на правильное место, когда он загружает файл (этоВот почему вы передаете -fPIC в командной строке gcc для dll).Но так как это делается во время загрузки, к тому времени, когда ваша программа запускает, размещение данных уже известно, поэтому загрузчик знает, где эти данные будут указателями на глобальные данные, все еще может действовать как константа в вашей программе.

Динамическая загрузка

Если вы динамически ссылаетесь на dll, загрузчик об этом не знает, поэтому вам нужно вызывать функции, которые знают, как загрузить dll и получить адрес ее экспортированных данных и функций.

6 голосов
/ 25 июня 2010

Глобальные переменные обычно хранятся в сегменте данных приложения.

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

4 голосов
/ 23 июля 2015

Все выделения, выполняемые malloc (), calloc () или realloc (), хранятся в куче, а все локальные переменные хранятся в стеке.

Все глобальные и статические переменные хранятся в сегменте данных, а константы хранятся в сегменте кода.

0 голосов
/ 25 июня 2010

Память через malloc() берется из кучи. Это обеспечивает указатель на память.

Подробнее здесь .

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