На некоторых старых компиляторах я встречал поведение статического размещения массива.Это означает, что он выделяет для него память при загрузке программы и использует это пространство после этого.Такое поведение небезопасно (см. Ответ Сергея), и я не ожидаю, что оно будет разрешено в соответствии со стандартами, но я столкнулся с ним в дикой природе.(Я не помню, какой это был компилятор.)
По большей части локальные переменные хранятся в стеке вместе с адресами возврата и всем прочим.Это означает, что неинициализированные значения могут содержать конфиденциальную информацию.Это также включает в себя массивы, согласно ответу unwind.
Другая правильная реализация состоит в том, что переменная, найденная в стеке, является указателем, и что компилятор выполняет выделение и освобождение (предположительно безопасным способом исключения) вкапот.Это сэкономит место в стеке (которое должно быть выделено до запуска программы и не может быть легко расширено для архитектур x86), а также весьма полезно для стандарта C VLA (массив переменной длины, он же бедный mans std :: vector)