|Модель | Описание | |---|---| | Автоматическая |Вы объявляете переменную при первом использовании, и она автоматически удаляется при выходе из области видимости. Без ключевого слова `static` любая переменная, объявленная внутри функции, является автоматической. В типичном языке программирования все данные автоматические. | |Статическая | Статические переменные находятся в одном и том же месте в течение всего времени работы программы. Размер массива фиксирован в момент создания, но значения в нем могут изменяться (поэтому массив нельзя назвать истинно статическим ). Данные инициализируются до начала выполнения функции `main`, поэтому ининиализировать их можно только константами, не требующими вычислений. Переменные, объявленные вне функций ( в области видимости файла) и внутри функций с ключевым словом `static`, являются статическими. Если вы забудете инициализировать статическую переменную, она будет инициализирована нулями (или значением NULL).| | Динамическая | Динамическая память неразрывно связана с функциями `malloc` и `free`, именно здесь происходит большинство ошибок нарушения защиты памяти (segfault). Кроме того, это единственный тип памяти, позволяющий изменять размер массива после его объявления. | Различтя между типами памяти | | Статическая | Автоматическая | Динамическая | |---|---|---|---| | Обнуляется на этапе запуска | + | - | - | | Ограничена областью видимости | + | + | - | | Можно задавать значение во время инициализации | + | + | - | | Можно инициализировать неконстантным значением | - | + | - | | `sizeof` позволяет получить размер массива| + | + | - | | Сохраняется между вызовами функции | + | - | + | | Может быть глобальной | + | - | + | | Размер массива можно задать во время выполнения | - | + | + | | Размер массива можно изменять | - | - | + |