Een statische lokale variabele wordt gedefinieerd met het sleutelwoord static binnen een functie. In tegenstelling tot gewone lokale variabelen behoudt deze zijn waarde tussen functie-aanroepen en wordt deze slechts één keer geïnitialiseerd. Deze variabele bestaat gedurende de levensduur van het programma, maar is alleen zichtbaar binnen zijn functie.
Gewone lokale variabele:
void func() { int count = 0; // elke keer geïnitialiseerd count++; printf("%d\n", count); }
Elke keer dat je uit de functie komt — 1.
Statische lokale variabele:
void func() { static int count = 0; // wordt slechts één keer geïnitialiseerd count++; printf("%d\n", count); }
Bij opeenvolgende aanroepen krijgen we de uitvoer: 1, 2, 3, ...
Gebruik: handig voor het tellen van het aantal functie-aanroepen, het cachen van eenvoudige waarden.
"Zal de statische lokale variabele worden vernietigd na het verlaten van de functie en wat gebeurt er met zijn waarde bij de volgende aanroep van de functie?"
Vaak wordt er gezegd dat deze wordt vernietigd, maar dat is niet waar.
Het juiste antwoord: Een statische lokale variabele bestaat gedurende de levensduur van het programma. Deze behoudt zijn waarde tussen functie-aanroepen en wordt slechts één keer geïnitialiseerd (bij de eerste invoer in de functie, of vóór main).
Verhaal 1
In het project werden de tijdindicatoren gemeten bij toegang tot de module via een functie die elke toegang moest tellen. Men verwisselde int counter = 0; met static int counter = 0; — de functie gaf altijd 1 terug, de statistiek bleek nutteloos.
Verhaal 2
In een niet-draadveilige service werd een statische variabele in een functie gebruikt die vanuit verschillende threads werd aangeroepen. Dit leidde tot race-omstandigheden en willekeurige onjuiste resultaten. Men nam niet in aanmerking dat gedeeld geheugen niet beschermd was.
Verhaal 3
Een pointer naar dynamisch gealloceerd geheugen werd opgeslagen in een statische variabele voor cachen. Bij het opnieuw opstarten van de functie werd het oude geheugen niet vrijgegeven: er ontstond een geheugenlek bij elke aanroep.