logo

Zmienne statyczne w C

Zmienne statyczne mają tę właściwość, że zachowują swoją wartość nawet wtedy, gdy znajdą się poza swoim zakresem! W związku z tym zmienna statyczna zachowuje swoją poprzednią wartość w poprzednim zakresie i nie jest ponownie inicjowana w nowym zakresie.

Składnia:



  static   data_type   var_name   = var_value;>

Poniżej znajduje się kilka interesujących faktów na temat zmiennych statycznych w C:

instrukcja if-else Java

1) Statyczna zmienna int pozostaje w pamięci podczas działania programu. Zmienna normalna lub automatyczna zostaje zniszczona po zakończeniu wywołania funkcji, w której zmienna została zadeklarowana.
Na przykład możemy użyć static int do zliczenia liczby wywołań funkcji, ale nie można w tym celu użyć zmiennej automatycznej.

Przykład



C






// C Program to illustrate the static variable lifetime> #include> // function with static variable> int> fun()> {> >static> int> count = 0;> >count++;> >return> count;> }> int> main()> {> >printf>(>'%d '>, fun());> >printf>(>'%d '>, fun());> >return> 0;> }>

>

>

Wyjście

1 2>

Powyższy program wypisuje 1 2, ponieważ zmienne statyczne są inicjowane tylko raz i pozostają aktywne do końca programu. Dlatego mogą zachować swoją wartość między wieloma wywołaniami funkcji.

Spróbujmy tego samego kodu dla lokalnej zmiennej automatycznej.

Przykład

podnoszący na duchu

C




// C Program to illustrate local auto variable in comparison> // of static variable.> #include> // Function> int> fun()> {> >int> count = 0;> >count++;> >return> count;> }> // Driver Code> int> main()> {> >printf>(>'%d '>, fun());> >printf>(>'%d '>, fun());> >return> 0;> }>

lista.sortuj Java
>

>

Wyjście

1 1>

2) Zmienne statyczne przydzielają pamięć w segmencie danych, a nie w segmencie stosu. Zobacz układ pamięci programów C dla szczegółów.

3) Zmienne statyczne (takie jak zmienne globalne) są inicjowane jako 0, jeśli nie zostały zainicjowane jawnie. Na przykład w poniższym programie wartość x jest drukowana jako 0, podczas gdy wartość y jest czymś śmieciowym. Widzieć Ten po więcej szczegółów.

Przykład

C




// C program to illustrate the default value of static> // variables> #include> int> main()> {> >static> int> x;> >int> y;> >printf>(>'%d %d'>, x, y);> }>

>

10 z 100,00
>

Wyjście

0  [some_garbage_value]>

4) W C zmienne statyczne można inicjować tylko przy użyciu literałów stałych. Na przykład kompilacja następującego programu kończy się niepowodzeniem. Widzieć Ten po więcej szczegółów.

Przykład

C




lista.sortuj Java

#include> int> initializer(>void>)> {> >return> 50;> }> > int> main()> {> >static> int> i = initializer();> >printf>(>' value of i = %d'>, i);> >getchar>();> >return> 0;> }>

>

>

Wyjście

In function 'main': 9:5: error: initializer element is not constant  static int i = initializer();  ^>

Notatka: Należy pamiętać, że ten warunek nie obowiązuje w C++. Jeśli więc zapiszesz program jako program C++, skompiluje się i będzie działać poprawnie.

5) Statyczne zmienne globalne i funkcje są również możliwe w C/C++. Ich celem jest ograniczenie zakresu zmiennej lub funkcji do pliku. Należy zapoznać się Funkcje statyczne w C po więcej szczegółów.

6) Zmienne statyczne nie powinny być deklarowane wewnątrz struktury. Powodem jest to, że kompilator C wymaga umieszczenia razem wszystkich elementów struktury (tj. alokacja pamięci dla elementów struktury powinna być ciągła). Istnieje możliwość zadeklarowania struktury wewnątrz funkcji (segment stosu), dynamicznej alokacji pamięci (segment sterty) lub nawet globalnej (BSS lub segment danych). Niezależnie od sytuacji wszystkie elementy struktury powinny znajdować się w tym samym segmencie pamięci, ponieważ wartość elementu struktury jest pobierana poprzez zliczenie przesunięcia elementu od adresu początkowego struktury. Oddzielenie jednego elementu do segmentu danych jest sprzeczne z celem struktury i możliwe jest posiadanie całej struktury jako statycznej.

Powiązane artykuły:

  • Statyczne słowo kluczowe w C++
  • Quiz na temat statycznego słowa kluczowego
  • Statyczne elementy danych w C++
  • Kiedy niszczone są obiekty statyczne?
  • Interesujące fakty na temat statycznych funkcji składowych
  • Czy funkcje statyczne mogą być wirtualne?
  • Porównanie statycznych słów kluczowych w C++ i Javie
  • Funkcje statyczne w C