Okres istnienia
„Okres istnienia” jest okresem podczas wykonywania programu, w którym istnieje zmienna lub funkcja. Czas magazynowania identyfikatora określa jego okres istnienia.
Identyfikator zadeklarowany za pomocą specyfikatora static
klasy magazynu ma czas trwania magazynu statycznego. Identyfikatory z statycznym czasem magazynowania (zwane również „global”) są przechowywane i mają zdefiniowaną wartość na czas trwania programu. Magazyn jest zarezerwowany i wartość przechowywana identyfikatora jest zainicjowana tylko raz, przed uruchomieniem programu. Identyfikator zadeklarowany z połączeniem zewnętrznym lub wewnętrznym ma również czas trwania magazynu statycznego (zobacz Linkage).
Identyfikator zadeklarowany bez specyfikatora static
klasy magazynu ma automatyczny czas trwania magazynu, jeśli jest zadeklarowany wewnątrz funkcji. Identyfikator z czasem automatycznego przechowywania („identyfikator lokalny”) posiada magazyn i zdefiniowaną wartością tylko w bloku, w którym został zdefiniowany lub zadeklarowany identyfikator. Nowy magazyn jest każdorazowo przydzielany automatycznemu identyfikatorowi, program wchodzi do tego bloku, a następnie traci swój magazyn (oraz jego wartość) gdy program zamyka blok. Identyfikatory zadeklarowane w funkcji bez powiązania mają również automatyczny czas magazynowania.
Następujące reguły określają, czy identyfikator ma globalny (statyczny) lub lokalny (automatyczny) okres istnienia:
Wszystkie funkcje mają statyczny okres istnienia. Dlatego istnieją cały czas podczas wykonywania programu. Identyfikatory zadeklarowane na poziomie zewnętrznym (czyli na zewnątrz wszystkich bloków w programie, na tym samym poziomie co definicje funkcji) zawsze mają globalne (statyczne) okresy istnienia.
Jeśli zmienna lokalna ma inicjator, zmienna jest inicjowana za każdym razem, gdy zostanie utworzona (chyba że zostanie zadeklarowana jako
static
). Parametry funkcji mają również lokalne okresy istnienia. Można określić globalny okres istnienia identyfikatora w bloku, uwzględniającstatic
specyfikator klasy magazynu w jego deklaracji. Po zadeklarowaniustatic
zmienna zachowuje swoją wartość z jednego wpisu bloku do następnego.
Mimo że identyfikator z okresem istnienia globalnego istnieje w trakcie wykonywania programu źródłowego (na przykład zewnętrznie zadeklarowana zmienna lub zmienna lokalna zadeklarowana za pomocą static
słowa kluczowego), może nie być widoczna we wszystkich częściach programu. Zobacz Zakres i widoczność , aby uzyskać informacje o widoczności, i zobacz Klasy magazynu, aby zapoznać się z omówieniem nieterminalnego specyfikatora klasy magazynu.
Pamięć może być przydzielenia w razie potrzeby (dynamicznie), jeżeli użytkownik użyje specjalnie utworzonej biblioteki procedur, takiej jak malloc
. Ponieważ dynamiczna alokacja pamięci używa biblioteki procedur, nie uważa się tego za część języka. Zobacz funkcję malloc w dokumentacji biblioteki czasu wykonywania.