logo

Statické premenné v C

Statické premenné majú vlastnosť zachovať si svoju hodnotu aj po tom, čo sú mimo ich rozsah! Statická premenná si teda zachováva svoju predchádzajúcu hodnotu vo svojom predchádzajúcom rozsahu a v novom rozsahu sa znova neinicializuje.

Syntax:



  static   data_type   var_name   = var_value;>

Nasleduje niekoľko zaujímavých faktov o statických premenných v C:

strsep c

1) Počas behu programu zostáva v pamäti statická premenná int. Normálna alebo automatická premenná sa zničí, keď sa skončí volanie funkcie, kde bola premenná deklarovaná.
Napríklad môžeme použiť statický int na počítanie, koľkokrát bola funkcia volaná, ale na tento účel nemožno použiť premennú auto.

Príklad



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;> }>

>

>

Výkon

1 2>

Vyššie uvedený program vypíše 1 2, pretože statické premenné sa inicializujú iba raz a fungujú až do konca programu. Preto si môžu zachovať svoju hodnotu medzi viacerými volaniami funkcií.

Skúsme rovnaký kód pre lokálnu automatickú premennú.

Príklad

enum tostring java

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;> }>

>

>

Výkon

verzie pre Android
1 1>

2) Statické premenné majú alokovanú pamäť v dátovom segmente, nie v zásobníku. Pozrite si rozloženie pamäte programov C pre podrobnosti.

3) Statické premenné (ako globálne premenné) sú inicializované ako 0, ak nie sú inicializované explicitne. Napríklad v nižšie uvedenom programe je hodnota x vytlačená ako 0, zatiaľ čo hodnota y je niečo nezmyselné. Pozri toto pre viac detailov.

Príklad

C




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

>

rovná sa metóda v jave
>

Výkon

0  [some_garbage_value]>

4) V jazyku C je možné statické premenné inicializovať iba pomocou konštantných literálov. Napríklad nasledujúci program zlyhá pri kompilácii. Pozri toto pre viac detailov.

Príklad

C




výber z viacerých tabuliek sql

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

>

>

Výkon

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

Poznámka: Upozorňujeme, že táto podmienka neplatí v C++. Takže ak uložíte program ako program v C++, skompiluje sa a bude fungovať dobre.

5) V C/C++ sú možné aj statické globálne premenné a funkcie. Účelom týchto je obmedziť rozsah premennej alebo funkcie na súbor. Pozrite si prosím Statické funkcie v C pre viac detailov.

6) Statické premenné by nemali byť deklarované vo vnútri štruktúry. Dôvodom je, že kompilátor C vyžaduje, aby boli všetky prvky štruktúry umiestnené spolu (t. j. alokácia pamäte pre členov štruktúry by mala byť súvislá). Je možné deklarovať štruktúru vo vnútri funkcie (stack segment) alebo alokovať pamäť dynamicky (heap segment) alebo môže byť dokonca globálna (BSS alebo dátový segment). Nech je to akokoľvek, všetci členovia štruktúry by sa mali nachádzať v rovnakom pamäťovom segmente, pretože hodnota pre prvok štruktúry sa získa počítaním posunu prvku od počiatočnej adresy štruktúry. Samostatné oddelenie jedného člena do dátového segmentu bráni účelu štruktúry a je možné mať celú štruktúru ako statickú.

Súvisiace články:

  • Statické kľúčové slovo v C++
  • Kvíz o statickom kľúčovom slove
  • Statické dátové členy v C++
  • Kedy sú zničené statické objekty?
  • Zaujímavé fakty o statických členských funkciách
  • Môžu byť statické funkcie virtuálne?
  • Porovnanie statických kľúčových slov v C++ a Java
  • Statické funkcie v C