Achtergrond
Multidimensionale arrays in de programmeertaal C zijn oorspronkelijk bedoeld om het werken met tabellen en matrices te vereenvoudigen. Een klassieke tweedimensionale array is een array van arrays, waarmee je eenvoudig met tabulaire gegevens kunt werken met een eenvoudige syntaxis. In de loop der tijd is deze aanpak geëvolueerd, vooral bij het werken met arrays van variabele lengte.
Probleem
Onjuiste declaratie en initialisatie van multidimensionale arrays leidt tot compilatiefouten of logische fouten. Bij het doorgeven van een multidimensionale array aan een functie raken veel ontwikkelaars in de war door de vereisten van de specificatie — het is noodzakelijk om expliciet de afmetingen van alle behalve de eerste dimensie op te geven.
Oplossing
Declaratie van een tweedimensionale array:
int matrix[3][4];
Volledige initialisatie:
int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} };
Doorgeven aan een functie — alle afmetingen, behalve de eerste, moeten expliciet worden opgegeven:
void printMatrix(int m[][3], int rows) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < 3; ++j) printf("%d ", m[i][j]); printf(" "); } }
Met de introductie van de C99-standaard kunnen functies worden gedeclareerd die arrays van variabele lengte accepteren:
void foo(int rows, int cols, int a[rows][cols]);
Belangrijke kenmerken:
1. Is het mogelijk om een functie te declareren die een tweedimensionale array accepteert zonder de tweede maat op te geven?
Nee, C vereist dat alle afmetingen behalve de eerste bekend zijn op het moment van compileren. Dit heeft te maken met pointerarithmetic bij het benaderen van elementen.
Voorbeeld van een fout:
// Fout: void process(int arr[][], int rows); // Niet toegestaan
2. Wat gebeurt er als niet alle elementen van een multidimensionale array worden geïntialiseerd?
De resterende elementen worden automatisch op nul gezet als de array statisch of globaal is. Voor een lokale array met gedeeltelijke initialisatie zullen de impliciet geïnitialiseerde elementen ook nul zijn.
int a[2][3] = {{1}, {4}}; // a[0][1] en a[0][2], a[1][1] en a[1][2] worden 0
3. Wat is het verschil tussen een array van pointers en een tweedimensionale array?
Een tweedimensionale array is een enkele geheugenblok. Een array van pointers is een verzameling pointers naar afzonderlijke (mogelijk apart toegewezen) eendimensionale arrays. Dit is belangrijk, bijvoorbeeld, bij het toewijzen van geheugen voor “scheve” arrays.
Een poging om een tweedimensionale array te declareren en door te geven zonder de tweede maat op te geven aan een functie, wat leidt tot een compilatiefout. Een oppervlakkige oplossing door te vervangen door een pointer leidt tot onbepaalde of onjuiste gedraging bij verdere berekeningen.
Voordelen:
Nadelen:
De ontwikkelaar geeft expliciet de afmetingen van alle dimensies op, legt in de documentatie uit welke volgorde de elementen in het geheugen zijn opgeslagen, waardoor het aantal fouten bij verder onderhoud wordt verminderd.
Voordelen:
Nadelen: