logo

Statické proměnné v C

Statické proměnné mají tu vlastnost, že si uchovávají svou hodnotu i poté, co jsou mimo jejich rozsah! Statická proměnná si tedy zachovává svou předchozí hodnotu ve svém předchozím rozsahu a není znovu inicializována v novém rozsahu.

Syntax:



  static   data_type   var_name   = var_value;>

Následuje několik zajímavých faktů o statických proměnných v C:

xvideoservicethief ubuntu 14.04 ke stažení

1) Během běhu programu zůstává v paměti statická proměnná int. Normální nebo automatická proměnná je zničena, když skončí volání funkce, kde byla proměnná deklarována.
Například můžeme použít statický int k počítání, kolikrát byla funkce volána, ale pro tento účel nelze použít proměnnou auto.

Pří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ýstup

1 2>

Výše uvedený program vypíše 1 2, protože statické proměnné jsou inicializovány pouze jednou a fungují až do konce programu. Proto si mohou zachovat svou hodnotu mezi vícenásobným voláním funkcí.

Zkusme stejný kód pro místní proměnnou auto.

Příklad

c++ rozdělení řetězce

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

>

bash číst soubor
>

Výstup

1 1>

2) Statické proměnné mají přidělenou paměť v datovém segmentu, nikoli v segmentu zásobníku. Viz rozložení paměti programů C pro detaily.

3) Statické proměnné (jako globální proměnné) jsou inicializovány jako 0, pokud nejsou inicializovány explicitně. Například v níže uvedeném programu je hodnota x vytištěna jako 0, zatímco hodnota y je něco nesmyslného. Vidět tento Více podrobností.

Pří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);> }>

>

>

Výstup

0  [some_garbage_value]>

4) V C lze statické proměnné inicializovat pouze pomocí konstantních literálů. Například následující program selže při kompilaci. Vidět tento Více podrobností.

sníh vs led

Příklad

C




javascript onload skript

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

>

>

Výstup

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

Poznámka: Upozorňujeme, že tato podmínka neplatí v C++. Pokud tedy program uložíte jako program v jazyce C++, zkompiluje se a běží v pořádku.

5) Statické globální proměnné a funkce jsou také možné v C/C++. Účelem těchto je omezit rozsah proměnné nebo funkce na soubor. Obraťte se prosím na Statické funkce v C Více podrobností.

6) Statické proměnné by neměly být deklarovány uvnitř struktury. Důvodem je, že kompilátor C vyžaduje, aby byly všechny prvky struktury umístěny společně (tj. alokace paměti pro členy struktury by měla být souvislá. Je možné deklarovat strukturu uvnitř funkce (stack segment) nebo alokovat paměť dynamicky (heap segment) nebo může být i globální (BSS nebo datový segment). Ať už je to jakkoli, všechny členy struktury by měly být umístěny ve stejném segmentu paměti, protože hodnota pro prvek struktury je načtena počítáním offsetu prvku od počáteční adresy struktury. Samostatné oddělení jednoho člena na datový segment maří účel struktury a je možné mít celou strukturu jako statickou.

Související články:

  • Statické klíčové slovo v C++
  • Kvíz o statických klíčových slovech
  • Statické datové členy v C++
  • Kdy jsou zničeny statické objekty?
  • Zajímavá fakta o statických členských funkcích
  • Mohou být statické funkce virtuální?
  • Porovnání statických klíčových slov v C++ a Javě
  • Statické funkce v C