Bij het doorgeven van een pointer of array aan een functie in de programmeertaal C, wordt in feite een kopie van de waarde van de pointer (dat wil zeggen het geheugenadres) doorgegeven, en niet de array zelf of de inhoud van het geheugen. Historisch gezien worden arrays in C niet bij waarde doorgegeven — in plaats daarvan gaat er een pointer naar het eerste element van de array naar de functie. Dit mechanisme bespaart geheugen, maar kan ongewenste bijeffecten hebben bij onjuist gebruik.
Probleem — verwarring tussen pointers en arrays: vaak denken ontwikkelaars dat de array binnen de functie niet extern kan worden gewijzigd of dat de functie automatisch de grootte van de doorgegeven array kent. In de praktijk verliest de functie de oorspronkelijke grootte van de array en kan deze gemakkelijk buiten de grenzen ervan komen.
Oplossing — altijd de grootte van de array expliciet doorgeven als een apart argument, het verschil tussen een kopie van de pointer en een kopie van het object duidelijk begrijpen, en niet vergeten dat elke wijziging via de pointer de oorspronkelijke gegevens beïnvloedt.
Voorbeeld van correcte array overdracht:
void print_array(const int* arr, size_t size) { for (size_t i = 0; i < size; ++i) printf("%d ", arr[i]); } int main() { int nums[] = {1,2,3,4,5}; print_array(nums, sizeof(nums)/sizeof(nums[0])); return 0; }
Belangrijke kenmerken:
Kan een functie de lengte van de doorgegeven array weten als deze werd verklaard als int arr[10]?
Antwoord: Nee, binnen de functie zal de expressie sizeof(arr) de grootte van de pointer retourneren, en niet die van de hele array. De grootte moet apart worden doorgegeven.
Is het doorgeven van een array als int arr[] en als int arr in functies hetzelfde?*
Antwoord: Ja, in de functie handtekening is dit gelijkwaardig — in beide gevallen wordt een pointer naar int doorgegeven. De verschillen zijn alleen syntactisch.
Als je de elementen van de array binnen de functie wijzigt, verandert de oorspronkelijke array dan?
Antwoord: Ja, aangezien een pointer is doorgegeven, wijzigt de functie het geheugen waar deze naar verwijst.
Een project implementeerde een functie voor het initialiseren van arrays, waarbij de grootte binnen de functie werd bepaald door sizeof(arr) / sizeof(arr[0]). Tijdens de testfase werkte de functie, maar bij het verwerken van andere arrays overschreef het vreemde geheugen of werkte het incorrect.
Voordelen:
Nadelen:
De functie accepteerde altijd de grootte van de array als een apart parameter, de lengte werd berekend door de aanroepende kant. Binnen de functie werd er alleen gewerkt met de doorgegeven parameters.
Voordelen:
Nadelen: