Класи пам'яті даних
Клас пам'яті, час існування та видимість об'єкта Кожен обєкт програми (змінна, функція,...) має свій тип і клас памяті. Тип визначає обсяг памяті для обєкта і операції, що можуть виконуватись над обєктом. Клас пам'яті задає місце розташування об'єкта в оперативній пам'яті та встановлює для нього час існування, тобто час, протягом якого обєкт зберігається в оперативній памяті, і область видимості, яка визначає ту частину програми, де можна використовувати цей обєкт. На відміну від типу, клас памяті можна явно не вказувати, тоді він встановлюється компілятором за місцем оголошення об'єкта. За часом існування обєкти поділяють на три групи: глобальні (або статичні) – існують протягом усього часу виконання програми; локальні – існують лише при виконанні блоку, де вони оголошені; динамічні – час існування змінюється програмою.
Глобальні дані зберігаються в окремій області оперативної памяті – сегменті даних. Локальні дані – в області, що називається стеком. Динамічні дані – в області динамічної памяті. За правилами замовчування змінні, описані всередині блоку, та формальні параметри функцій мають локальний час існування. Змінні, описані зовні всіх блоків (між функціями) мають глобальний час існування. ( Блоком вважається тіло функції, а також внутрішня група описів у фігурних дужках) Функції в С – програмах можна описувати тільки на зовнішньому рівні, тому всі функції мають глобальний час існування. За областю видимості (або областю дії) обєкти ділять на три групи: глобальні – видимі в межах усієї програми; частково глобальні – видимі в межах одного програмного файла; локальні – видимі в блоці, де оголошено даний обєкт.
Область дії глобальних і локальних змінних Переважно змінні програми мають локальний час існування та локальну видимість. Глобальними оголошують окремі змінні, призначені для спільного використання. Правила: - змінні зовнішнього рівня (між функціями) є частково глобальними з областю дії від точки оголошення до кінця файла; - змінні внутрішнього рівня (всередені блоку) і формальні параметри функцій мають область дії від точки оголошення до кінця функції (блоку); - змінні- параметри прототипу функції видимі в межах цього прототипу; - якщо імя внутрішньої змінної збігається з іменем зовнішнього обєкта, в межах блоку внутрішня змінна закриває зовнішню, а за межами блоку дія зовнішнього обєкта відновлюється; - клас памяті змінних можна встановити явно за допомогою специфікаторів.
#include … int n; //частково глобальна змінна int load(int n); //n - локальна для прототипу int main(int a) { //a - локальна для функції int i = 0; //i - локальна для блоку … } int load(int a) { int n = 0; //n - закриває зовнішню змінну … // з такою назвою в межах блоку } Всі глобальні та статичні змінні автоматично ініціалізуються нульовими значеннями, а для локальних це не виконується.
Специфікатори класів пам'яті Специфікатори застосовують тільки тоді, коли потрібно змінити стандартний клас памяті обєкта, інакше він встановлюється за правилами замовчування. Синтаксис: специфікатор_класу_памяті тип імя_змінної Специфі- катор Клас пам'яті Застосування Час існування Область дії Автоматична ініціалізація локальні змінні глобальні змінні autoавтоматичнийтакнілокальнийлокальнавідсутня registerрегістровийтакнілокальнийлокальнавідсутня staticстатичнийтак глобальний локальна / частково- глобальна ініціалізація нулем externзовнішнійтак глобальний частково- глобальна ініціалізація заборонена
Специфікатори локальних змінних: auto - клас за замовчуванням; register - зберігання змінної у регістрі процесора, дає змогу істотно скоротити час звертання до змінних, за відсутності вільних регістрів змінна буде опрацьовуватись як змінна з класом auto; така змінна не має адреси; static - статичні змінні існуються протягом усього часу виконання програми, проте областю їх дії залишається той блок, у якому вони оголошені; extern - змінна є посиланням на глобальну змінну з тим самим іменем і типом, описану далі в тексті програми або в іншому програмному файлі. Специфікатори глобальних змінних: static - областю дії даної змінної буде частина програми від точки опису до кінця файлу; в інших файлах програми ця змінна недоступна; extern - змінні є посиланнями на відповідні зовнішні змінні та роблять ці змінні видимими (оголошеними) в межах поточного файлу.