Geschiedenis van de kwestie
In de C-taal is werken met arrays een fundamenteel aspect van programmeren. C biedt twee hoofdcategorieën van arrays: statische (de grootte is bekend tijdens de compilatie en wordt op de stack of in het statische/grote geheugen toegewezen) en dynamische (de grootte wordt tijdens de uitvoering bepaald). Statische arrays zijn vanaf het begin van de C-taal gebruikt en benadrukken prestaties en eenvoud.
Probleem
Als men het verschil tussen statische en dynamische arrays niet begrijpt, kan men tegen fouten aanlopen: toegang buiten de grenzen van de array, niet-vrijgegeven geheugen of fouten in het beheer van de levensduur van gegevens. Onjuiste initialisatie van statische arrays kan leiden tot het lezen van afgedankte of niet-geïnitialiseerde gegevens.
Oplossing
De verklaring van een statische array ziet er als volgt uit:
int arr[5] = {1, 2, 3, 4, 5};
Hierbij worden de grootte en inhoud van de array bepaald tijdens de compilatie, en het geheugen wordt toegewezen op de stack (voor lokale automatische arrays) of in het statische geheugen (bij het declareren van de array als static of globaal). Bijzondere aandacht moet worden besteed aan gedeeltelijke initialisatie, waarbij niet opgegeven elementen met nul worden ingevuld.
De grootte van een statische array kan niet worden gewijzigd tijdens de uitvoering van het programma, wat het verschil vormt met dynamische arrays.
Belangrijke kenmerken:
1. Wat gebeurt er als een statische array in een functie niet expliciet wordt geïnitialiseerd?
Lokal automatische (auto) statische arrays hebben niet-geïnitialiseerde elementen met onbepaalde waarden. Maar als de array wordt gedeclareerd met de modifier static of als globaal, zullen alle elementen standaard op nul worden geïnitialiseerd.
Voorbeeld:
void foo() { int arr1[3]; // Waarden zijn niet gedefinieerd! static int arr2[3]; // Alle elementen zijn gelijk aan 0 }
2. Is het mogelijk om een statische array naar een functie door te geven, zodat de functie zijn grootte kan wijzigen?
Nee, de grootte van een statische array kan niet worden gewijzigd - deze is strikt gedefinieerd bij de verklaring. De functie kan met zijn inhoud werken, maar niet met de grootte.
Voorbeeld van correcte arrayoverdracht:
void processArray(int arr[], int size) { arr[0] = 42; }
3. Wat gebeurt er als de grenzen van de statische array worden overschreden? Zal er een runtime-fout optreden?
Nee, de C-taal controleert niet op overschrijding van de arraygrenzen. Dit gedrag staat bekend als undefined behavior en kan leiden tot crashes, gegevenscorruptie of verborgen fouten.
Een ontwikkelaar declareert een lokale array, vergeet deze te initialiseren en gebruikt deze later in een lus. Het programma geeft verschillende resultaten bij elke uitvoering, soms treedt er een crash op tijdens het lezen.
Voordelen:
Nadelen:
Een ontwikkelaar initialiseert de array ofwel expliciet met waarden, of declareert deze als static voor automatische initialisatie met nullen. Controleert altijd de grootte en grenzen bij het gebruik van de array.
Voordelen:
Nadelen: