Следует отметить, что C не имеет понятия о стеке или куче, хотя предыдущие ответы верны ~ 99% времени и дают отличное понимание.
C определяет три срока хранения объектов: статический , автоматический и выделенный . (§6.2.4.1)
Статические объекты (например, глобальные переменные) доступны на протяжении всей программы.
Автоматические объекты существуют, пока их переменная находится в области видимости. Они перестают существовать, как только это выходит за рамки.
Обратите внимание, что это две крайности. C дает вам точку между: Выделенными объектами. (Поисковым термином будет динамически выделенная память .) С этими словами вы сообщаете компьютеру, когда объекты должны начинаться и заканчивать свое существование. И это делается с помощью стандартных функций malloc () (или производных) и free () .
Строго говоря, вам не нужно звонить бесплатно () . Или, может быть, вы делаете (вам нужно прочитать стандарт для авторизованного пункта по этому вопросу), но вы можете сделать все это в конце main () , непосредственно перед завершением программы. Или оставьте это для операционной системы, чтобы сделать это для вас (что большинство, если не все, делают). Но это опять-таки было бы конечностью - объекты появляются, когда вы вызываете malloc () , go после завершения вашей программы.
Мне не нужно подробно говорить о практических последствиях: память конечна. Вы можете выделить только столько байтов, прежде чем закончится память. Использование статических объектов для всего было бы слишком расточительным; пытаться повторно использовать куски или один большой кусок статической памяти было бы сложно и в любом случае аналогично подходу динамического распределения. Использование автоматического хранилища для долгоживущих объектов вынудит вас сделать их область видимости максимально большой, что примерно соответствует объему статических объектов.
-
Теперь некоторые заметки:
{
int *temp = malloc(sizeof(int));
*temp = 5;
//free(temp);
}
Обратите внимание, что temp
здесь - автоматический объект. Он будет жить только до тех пор, пока его область действия заканчивается на}. Объект указывает на , однако выделен. Он будет существовать до тех пор, пока вы не вызовете free () по его адресу. Поскольку temp
содержит единственную копию этого адреса, вы потеряете возможность звонить free (), как только temp
выйдет за рамки. Некоторая память будет постоянно выделена, но недоступна. Это называется утечка памяти .
Сборка мусора - это еще один метод управления хранилищем объектов. Реализация в C может выглядеть так:
{
int *temp = gc_malloc(sizeof(int));
*temp = 5;
}
Где в} компьютер решит, что последняя ссылка, temp
, на выделенный объект была потеряна, и что было бы неплохо освободить его.
Это компромисс, когда вам не нужно беспокоиться о свободных () объектах (что не является незначительной вещью, так как простые примеры могут заставить вас думать), но здесь gc_malloc () более сложна, чем просто malloc (), и там выполняется невидимый код}, где temp
выходит из области видимости. И это совсем другая тема, как компьютер может решить, что temp
было последней ссылкой. (Некоторые практические решения могут включать в себя написание большего кода вокруг «int * temp».)