Proměnné definované uvnitř funkce zanikají okamžikem návratu z funkce. Rozsah (nebo viditelnost) proměnné je omezena funkcí nebo případně blokem, pokud je proměnná definována uvnitř bloku.
Statické proměnné mají tu vlastnost, že si uchovávají svou hodnotu i poté, co jsou mimo svůj rozsah.
Statická proměnná si tedy zachovává svou předchozí hodnotu ze svého předchozího rozsahu a není znovu inicializována v novém rozsahu.
static <data_type> <var_name> = <var_value>;
Následuje několik zajímavých faktů o statických proměnných v C:
1. Statická proměnná int zůstává během běhu programu v paměti. 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.
// C Program to illustrate the static variable lifetime
#include <stdio.h>
// function with static variable
int fun()
{
static int count = 0;
count++;
return count;
}
int main()
{
printf("%d ", fun());
printf("%d ", fun());
return 0;
}
$ 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 2.
// C Program to illustrate local auto variable in comparison of static variable.
#include <stdio.h>
// Function
int fun()
{
int count = 0;
count++;
return count;
}
// Driver Code
int main()
{
printf("%d ", fun());
printf("%d ", fun());
return 0;
}
$ 1 1
2. Statickým proměnným je alokována paměť v datovém segmentu, nikoli v zásobníku. Podrobnosti viz rozložení paměti programů C.
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. Další podrobnosti naleznete zde.
// C program to illustrate the default value of static variables
#include <stdio.h>
int main()
{
static int x;
int y; (1)
printf("%d \n%d", x, y);
}
| 1 | Proměnná y není inicializovaná. |
0
(nějaké smetí) (1)
| 1 | Proměnná y není inicializovaná, proto se může vytisknout cokoliv. |
4. V C lze statické proměnné inicializovat pouze pomocí konstantních literálů. Následující program selže při kompilaci.
#include<stdio.h>
int initializer(void)
{
return 50;
}
int main()
{
static int i = initializer();
printf(" value of i = %d", i);
getchar();
return 0;
}
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$ gcc -o static4 static4.c
static4.c: In function ‘main’:
static4.c:9:20: error: initializer element is not constant
9 | static int i = initializer();
| ^~~~~~~~~~~
Důvod je jednoduchý: Všechny objekty s dobou trvání static musí být inicializovány (nastaveny na jejich počáteční hodnoty) před spuštěním funkce main(). Hodnotu, která není v době překladu známa, tedy nelze použít pro inicializaci statických proměnných.
5. Statické globální funkce jsou také možné v C. Účelem tohoto je omezit rozsah funkce na soubor. Další podrobnosti naleznete v části Statické funkce v C.
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, ale je možné mít celou strukturu jako statickou.