Pointers en arrays zijn verbonden in C, maar zijn niet hetzelfde:
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: 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.
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.