Вообще говоря, для программы на Си доступно три типа памяти.
- память для глобальных и статических переменных
- "автоматическая" память для локальных переменных и параметров функций
- динамическая память, которая выделяется самим программным кодом с использованием таких функций, как
malloc()
.
Автоматическая память (я называю это так, поскольку в C automatic
было ключевое слово, которое вы могли использовать для его указания), автоматически выделяется из стека программ или из регистра ЦП. файл, когда функция вводится и автоматически освобождается при выходе из функции.
Динамическая память выделяется из «кучи», которая представляет собой просто кучу памяти, а не в каком-либо определенном порядке.
В вашем коде у вас есть автоматическое и динамическое распределение:
int* t = (int*) malloc(sizeof(int));
Этот код выделяет память для указателя на стек (t
) и достаточно памяти для int
из кучи. Указатель на эту память сохраняется в t
int a = 4;
Этот код выделяет память для int
в стеке (a
) и сохраняет в нем int
4.
t = &a;
Этот код получает указатель на a
(который выделяется из стека) и сохраняет его в t
.
Обратите внимание, что предыдущее содержимое t
указателя на динамически выделенный блок памяти из кучи теперь потеряно. Теперь у вашей программы нет возможности освободить кучу памяти. Это называется утечкой памяти, и в более крупных программах ошибки такого рода приводят к тому, что использование памяти продолжает увеличиваться до тех пор, пока система не остановится или не произойдет сбой программы, поскольку она не может быть выделена для кучи памяти.
printf("%d\n",*t);
Это просто выводит то, на что указывает t
, то есть a
, что равно 4.
free(t);
free()
используется библиотекой C для возврата памяти, которая была выделенаиз кучи обратно в кучу. К сожалению, t
больше не указывает на память из кучи, он указывает на память в стеке. Вполне вероятно, что эта строка повреждает кучу. Если бы вы не собирались выходить из программы, это было бы катастрофой.