То, что вы просите, зависит от языковой реализации (компилятор).Чтобы ответить на ваш вопрос, это (упрощенный обзор) того, что компиляторы обычно делают для компилируемых языков (например, C / C ++):
Когда компилятор заканчивает анализ функции, он сохраняет таблицу символов всех локальных переменныхобъявленные в этой функции, даже те, которые объявлены «синтаксически» во время выполнения команд функции (например, переменные локальных циклов).Позже, когда ему нужно сгенерировать окончательный (сборочный) код, он генерирует необходимые инструкции для помещения (или просто перемещения указателя стека) достаточного пространства для всех локальных переменных.Так, локальные переменные цикла, например, не выделяются, когда цикл начинает выполнение.Скорее, они размещаются в начале выполнения функции, содержащей цикл.Компилятор также добавляет инструкции для удаления этого выделенного стекового пространства перед возвратом из функции.
Таким образом, автоматические переменные, такие как ваш массив символов, полностью размещаются в стеке в этом (общем) сценарии.
[EDIT] Массивы переменной длины (до C99)
Вышеприведенное обсуждение было для массивов, длина которых известна во время компиляции, например:
void f () {
char n[10];
....
}
Если мы останемся в терминах языка C (до C99) массивы переменной длины (массивы, длины которых неизвестны во время компиляции, а скорее во время выполнения) объявляются как указатель так:
void f() {
char *n;
... //array is later allocated using some kind of memory allocation construct
}
Это, фактически, просто объявляетуказатель на массив.Размер указателей известен компилятору.Итак, как я сказал выше, компилятор сможет зарезервировать необходимое хранилище для указателя на стек (только указатель, а не реальный массив) независимо от того, каким будет размер массива во время выполнения.Когда выполнение достигает строки, которая выделяет массив (например, с помощью malloc), хранилище массива выделяется динамически в куче, а его адрес сохраняется в локальной автоматической переменной n
.В языках без сборки мусора это требует освобождения (освобождения) зарезервированного хранилища из кучи вручную (т.е. программист должен добавить инструкцию, чтобы сделать это в программе, когда массив больше не нужен).Это не является необходимым для массива постоянного размера (который размещается в стеке), поскольку компилятор удаляет кадр стека перед возвратом из функции, как я говорил ранее.
[EDIT2]
Массивы переменной длины C99 не могут быть объявлены в стеке.Компилятор должен добавить некоторый код в результирующий машинный код, который обрабатывает его динамическое создание и уничтожение во время выполнения.