Geschiedenis van de vraag
De return operator werd in C geïntroduceerd om een functie expliciet te beëindigen en het resultaat terug te geven aan de aanroeper. In vroege programmeertalen was er niet altijd de mogelijkheid om waarden terug te geven, en het return-mechanisme maakte het mogelijk om expliciet het resultaat van berekeningen aan te geven. Dit verhoogde de expressiviteit en veiligheid van programma's.
Probleem
De belangrijkste taak: sluit de functie correct af en, indien nodig, geef een waarde terug die overeenkomt met een bepaald type. Fouten ontstaan vaak doordat een waarde van het verkeerde type wordt geretourneerd, pointers naar niet-bestaande of lokale variabelen, of doordat de aanroepende partij de geretourneerde waarde negeert.
Oplossing
Voorbeeldcode:
#include <stdio.h> struct Point { int x, y; }; struct Point make_point(int x, int y) { // retourneren van een structuur (kopie) struct Point p = {x, y}; return p; } int* dangerous() { int num = 42; return # // gevaarlijk: retourneren van het adres van een lokale variabele! } void do_nothing() { return; // correct voor functies van het type void } int main() { struct Point p = make_point(3, 4); printf("%d %d\n", p.x, p.y); int* ptr = dangerous(); // UB: ptr wijst naar een vernietigd gebied }
Belangrijke kenmerken:
Kan je return gebruiken in functies zonder waarde (void)?
Antwoord: Ja, "return;" kan worden geschreven voor void-functies, maar je kunt geen expressie opgeven (return x;) voor een void-functie.
Wat gebeurt er bij het retourneren van een array uit een functie?
Antwoord: In C kun je een array niet direct retourneren. Je kunt alleen een pointer retourneren (bijvoorbeeld naar een statische array), maar vaker moet je een pointer en de grootte retourneren of gebruik maken van een dynamisch toegewezen array.
int* make_arr() { static int arr[5] = {1,2,3,4,5}; return arr; // een statische array leeft verder na het verlaten van de functie }
Waarom is het gevaarlijk om een pointer naar een lokale variabele te retourneren?
Antwoord: Na het verlaten van de functie wordt het geheugen voor de lokale variabele vrijgegeven (stackgebied). Het gebruik van de geretourneerde pointer leidt tot onbepaalde gedrag.
Negatieve case
De functie retourneert een pointer naar een lokale variabele, de aanroeper ontvangt "rommel", onvoorspelbaar gedrag en zeldzame floating bugs.
Voordelen:
Nadelen:
Positieve case
Gebruik van de geretourneerde structuur (wordt per waarde gekopieerd) of het retourneren van een pointer naar statisch/dynamisch geheugen:
Voordelen:
Nadelen: