В названии говорится «Распределение и инициализация», и в этом вопросе говорится «Распределение и объявление».
Либо случаи
На самом деле это зависит от реализации компилятора. Если переменная объявлена, но никогда не используется, интеллектуальный компилятор выдает предупреждение и не выделяет его вообще в стеке.
Распределение означает предоставление пространства в стеке (или кучу, если его malloc
ред). Инициализация означает присвоение значения переменной. И Декларация сообщает компилятору, что переменная существует. Это также может означать, что переменная существует в каком-либо другом объектном файле, если ей предшествует extern
.
Чтобы ответить на ваш второй вопрос, опять же зависит его компилятор .. если компилятор видит, что значение переменной не изменяется, то int x
будет выделен один раз. Распределение в основном переводит стек вызовов на несколько вырезок для размещения данных. И освобождение будет заключаться в том, чтобы переместить стек вызовов на несколько вырезов (или байтов, если вы предпочитаете).
С другой стороны, static int
выделяется только один раз, вне области хранения стека, который обычно не позволяет освободить переменную до тех пор, пока программа не завершит ее выполнение.
Похоже, что школьное задание. – nothrow
@Yossarian Полностью неактуальен, если вопрос верен. – this
Это зависит от того, что вы подразумеваете под «выделенным». –