В C существует три основных типа памяти для данных (исключая постоянные):
- обычный, глобальный "data" * стек 1004 *
- , используемый для локальных данных
- куча, динамически управляемые данные
Первая область имеет фиксированный размер, определенный во время компиляции;все в нем является переменной, с адресом и размером.Вторая область, стек, похожа на первую: все, что хранится в ней, имеет имя, то есть является переменной.Отличие от локальных данных и глобальных данных заключается в том, что локальные данные существуют только при выполнении функции, а затем исчезают.Другими словами, каждая функция имеет свои локальные, временные данные, которые могут восприниматься точно так же, как глобальные данные, но исчезают.
Необходимо добавить две заметки.Во-первых, я написал «стек», потому что часто это стек, но это не обязательно;важно то, что это временно .Второе замечание: все, что программа делает или управляет, должно начинаться с переменной , которая находится в глобальных или локальных данных.Эти переменные являются воротами для всей другой памяти.
Самая интересная область - третья, куча.При запуске программы, вероятно, нет кучи (или она пуста).Чтобы использовать кучу, программа должна выделить («спросить») память из нее.Запрошенная память теперь «зарезервирована» для программы, которая должна хранить адрес (или «дескриптор») для этой области.Без сохранения адреса программа не сможет получить доступ к этой памяти.
Куча также является специальной, поскольку она является единственной областью, полностью управляемой программистом, а не компилятором.
Все всегда происходит от переменных .Так что вопрос «где будут храниться адреса указателей» может быть только один: в переменной.Если только он не был сохранен в самой куче, в области, доступной через указатель, который снова сохраняется в переменной в локальных или глобальных данных.