Geschiedenis van de kwestie: Globale en statische variabelen zijn geïntroduceerd in de C-taal om gegevens buiten de lokale functiecontext te bewaren. Automatische voorafgaande initialisatie en plaatsing in speciale secties van het uitvoerbare bestand optimaliseren het programma, maar leiden tegelijkertijd tot onduidelijk gedrag als men dit niet begrijpt.
Probleem: Het is belangrijk te weten dat globale en statische variabelen in C ofwel met een expliciete waarde worden geïnitialiseerd, ofwel automatisch met nullen (Zero Initialization). De initialisatie vindt plaats vóór de aanroep van main, wat het risico van toegang tot niet-geïnitialiseerde gegevens vermindert, maar onder bepaalde omstandigheden leidt dit tot onverwachte afhankelijkheden met betrekking tot de initialisatie van meerdere modules en de volgorde van hun lading.
Oplossing:
Voorbeeldcode:
#include <stdio.h> static int stat_var; int glob_var = 42; int main() { printf("static: %d, global: %d\n", stat_var, glob_var); }
Belangrijke kenmerken:
1. Kan men vertrouwen op de impliciete nul-initialisatie van statische variabelen en dit als een veilige praktijk beschouwen?
Technisch gezien werkt het, maar in grote projecten is het beter om variabelen expliciet te initialiseren voor de leesbaarheid en om mogelijke veranderingen in compilers/linkers te voorkomen.
2. Wat is het resultaat als een statische variabele in een externe functie zonder initialisatie is gedeclareerd?
Deze zal nog steeds met nul worden geïnitialiseerd: static int value; is altijd 0 bij uitvoering.
3. Wanneer vindt de initialisatie van een globale variabele met initialisator plaats, als de variabele in een afzonderlijke geïsoleerde module is gedeclareerd?
De initialisatie vindt plaats vóór de aanroep van main, maar tussen verschillende modules garandeert de standaard de volgorde van initialisatie van dergelijke variabelen niet, wat kan leiden tot toegang tot niet-geïnitialiseerde gegevens in de constructeur van een andere module.
Een ontwikkelaar heeft statische variabelen gedeclareerd om de algemene status op te slaan, in de veronderstelling dat deze altijd expliciet zouden worden geïnitialiseerd.
Voordelen:
Nadelen:
Na een review zijn de variabelen expliciet geïnitialiseerd op het moment van declaratie.
Voordelen:
Nadelen: