ProgrammatieEmbedded C ontwikkelaar

Beschrijf hoe je in de programmeertaal C multidimensionale arrays declareert en gebruikt. Welke valkuilen zijn er bij het doorgeven van deze arrays aan functies en bij de initialisatie?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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:

  • Alle afmetingen behalve de eerste moeten expliciet worden opgegeven bij het doorgeven aan functies.
  • Een multidimensionale array in C is een array van arrays; elementen zijn in het geheugen geïndexeerd volgens rijen (row-major order).
  • Deels initialisatie initialiseert niet opgegeven elementen op nul.

Lastige vragen.

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.

Typische fouten en antipatterns

  • Fouten bij het declareren van een functie met multidimensionale arrays (weergave van de interne afmetingen niet opgegeven).
  • Verkeerde verwisseling van rijen en kolommen bij het werken met row-major layout.
  • Een array van pointers wordt verwisseld met een echte multidimensionale array en vice versa.

Voorbeeld uit het leven

Negatief geval

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:

  • Eenvoudige functiedeclaratie (op het eerste gezicht).

Nadelen:

  • Compilatiefouten, onjuiste indexarithmetic, datacorruptie.

Positief geval

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:

  • Veilige, correcte en draagbare code.

Nadelen:

  • De grootte van de array of de “breedte” moet bekend zijn op het moment van compileren, of de C99-standaard en arrays van variabele lengte zijn vereist.