ProgrammatieC-ontwikkelaar

Wat is het verschil tussen pointers en arrays in de C-taal? Hoe geef je een array correct door aan een functie?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Pointers en arrays zijn verbonden in C, maar zijn niet hetzelfde:

  • Array — een verzameling van elementen van dezelfde type in het geheugen, bepaald door de grootte.
  • Pointer — een variabele die het adres in het geheugen opslaat waarnaar een array of een afzonderlijk object kan wijzen.

Bij het doorgeven van een array aan een functie wordt in feite een pointer naar het eerste element van de array doorgegeven (daarom geeft sizeof binnen de functie niet de grootte van de hele array, maar alleen de grootte van de pointer).

Syntax voor doorgeven:

void foo(int arr[], int size) { // arr — feitelijk int* for (int i = 0; i < size; ++i) printf("%d ", arr[i]); } int main() { int data[5] = {1,2,3,4,5}; foo(data, 5); }

Vraag met een valstrik.

Vraag: Wat retourneert de expressie sizeof(arr) binnen de functie, als arr een parameter van het type int arr[] is?

Verlies: Het retourneert de grootte van de pointer (sizeof(int*)), en niet de grootte van de hele array. Omdat er een pointer naar het eerste element aan de functie wordt doorgegeven, gaat de informatie over de lengte verloren.

Voorbeeld code:

void printSize(int arr[]) { printf("%zu ", sizeof(arr)); // sizeof(int*) meestal 4 of 8 }

Geschiedenis

In een commercieel project was er code geschreven om het gemiddelde van een array te berekenen, waarbij voor het aantal elementen binnen de functie sizeof(arr) / sizeof(arr[0]) werd genomen, wat altijd 1 of 2 retourneerde in plaats van het werkelijke aantal elementen. Hierdoor werkte het programma incorrect met de gegevens en gemiddelde waarden niet correct.


Geschiedenis

In een project werd een dynamisch gealloceerde array doorgegeven aan een functie zonder aparte opslag van de lengte (size). Hierdoor wist de functie niet hoeveel elementen waren toegewezen, wat leidde tot overschrijdingen, lekken of geheugenbeschadigingen.


Geschiedenis

Per ongeluk werd een array van vaste grootte als pointer gebruikt, en op sommige compilers was directe toewijzing via memcpy van de hele array in plaats van de elementen toegestaan. Dit leidde tot een onduidelijke fout waarbij delen van de datastructuur verloren gingen of er een stack overflow optrad.