Scope en lifetime van variabelen zijn enkele van de belangrijkste aspecten van de structuur van een programma in C. Scope is het deel van de code waar een variabele toegankelijk is via naam. Lifetime bepaalt wanneer een variabele daadwerkelijk in het geheugen bestaat.
Achtergrond
C is ontworpen voor low-level controle, wat resulteert in een flexibele maar gevaarlijke benadering van scope en lifetime door variabelen te classificeren op basis van hun declaratieplaats (blokkeren, bestand, globaal, statisch).
Probleem
Een verkeerd begrip van scope/lifetime leidt tot klassieke bugs: pogingen om toegang te krijgen tot niet-toegankelijke of al verwijderde variabelen (use-after-free), naamconflicten tussen globale en lokale variabelen (shadow variables), onbedoelde wijzigingen van globale variabelen.
Oplossing
Definieer expliciet het benodigde opslagtype (auto, static, extern), gebruik verstandig blokkering scope, minimaliseer het aantal globale variabelen, en maak een duidelijk onderscheid tussen lifetime op de stack en buiten de stack.
Voorbeeldcode:
int global_var; // Globaal, leeft de hele runtime void func() { int local_var = 5; // Automatisch, leeft binnen func() static int stat_var = 0; // Statisch, leeft tussen aanroepen stat_var++; }
Belangrijkste kenmerken:
Wat gebeurt er als je twee variabelen met dezelfde naam in verschillende blokken declareert?
De interne variabele verbergt de externe (shadow variable). Dit kan leiden tot onverwachte fouten.
int x = 10; ... if (1) { int x = 50; printf("%d", x); // print 50, globale x is verborgen }
Wat is de lifetime van een automatische variabele gedefinieerd binnen een functie?
Deze bestaat alleen tijdens de aanroep van de functie. Na het verlaten wordt het geheugen vrijgegeven en gaat de waarde verloren.
Kan een statische lokale variabele buiten de functie waarvoor ze is gedeclareerd worden gebruikt?
Nee, haar scope is alleen binnen de functie. Ze is niet zichtbaar van buitenaf, ondanks dat de lifetime de volledige uitvoering van het programma is.
void f() { static int x = 0; } // Niet toegankelijk buiten f()
static vs auto).Een beginnende ontwikkelaar maakt een teller binnen een lus als static, en deze teller "voegt" waarden toe tussen iteraties, terwijl elke keer nulstelling werd verwacht.
Voordelen:
Nadelen:
De ontwikkelaar gebruikt static strikt voor caching, en voor tijdelijke behoeften - gewone auto-variabelen.
Voordelen:
Nadelen: