Geschichte der Frage
Der return-Operator erschien in C, um das Ende einer Funktion ausdrücklich zu kennzeichnen und ein Ergebnis an den aufrufenden Code zurückzugeben. In frühen Programmiersprachen gab es nicht immer die Möglichkeit, Werte zurückzugeben, und der return-Mechanismus erlaubte es, die Ergebnisse der Berechnungen eindeutig anzugeben. Dies erhöhte die Ausdruckskraft und die Sicherheit von Programmen.
Problem
Die Hauptaufgabe: die Funktion korrekt zu beenden und, falls erforderlich, einen Wert zurückzugeben, der einem bestimmten Typ entspricht. Fehler treten häufig auf, wenn ein Wert eines falschen Typs zurückgegeben wird, bei Zeigern auf nicht existierende oder lokale Variablen oder wenn der Rückgabewert von der aufrufenden Seite ignoriert wird.
Lösung
Beispielcode:
#include <stdio.h> struct Point { int x, y; }; struct Point make_point(int x, int y) { // gibt Struktur zurück (Kopie) struct Point p = {x, y}; return p; } int* dangerous() { int num = 42; return # // gefährlich: gibt Adresse einer lokalen Variable zurück! } void do_nothing() { return; // korrekt für Funktionen vom Typ void } int main() { struct Point p = make_point(3, 4); printf("%d %d\n", p.x, p.y); int* ptr = dangerous(); // UB: ptr zeigt auf gelöschten Bereich }
Wesentliche Merkmale:
Kann man return in Funktionen ohne Wert (void) verwenden?
Antwort: Ja, "return;" kann für void-Funktionen geschrieben werden, aber Sie dürfen keinen Ausdruck angeben (return x;) für void-Funktionen.
Was passiert bei der Rückgabe eines Arrays aus einer Funktion?
Antwort: In C kann ein Array nicht direkt zurückgegeben werden. Man kann nur einen Zeiger zurückgeben (z. B. auf ein statisches Array), aber es ist häufiger sinnvoll, einen Zeiger und die Größe zurückzugeben oder ein dynamisch zugewiesenes Array zu verwenden.
int* make_arr() { static int arr[5] = {1,2,3,4,5}; return arr; // statisches Array lebt nach dem Verlassen der Funktion }
Warum ist es gefährlich, einen Zeiger auf eine lokale Variable zurückzugeben?
Antwort: Nach dem Verlassen der Funktion wird der Speicher für die lokale Variable freigegeben (Stackspeicherbereich). Die Verwendung des zurückgegebenen Zeigers führt zu unbestimmtem Verhalten.
Negativer Fall
Die Funktion gibt einen Zeiger auf eine lokale Variable zurück, der Aufrufer erhält "Müll", unvorhersehbares Verhalten und seltene flüchtige Bugs.
Vorteile:
Nachteile:
Positiver Fall
Verwendung der zurückgegebenen Struktur (wird nach Wert kopiert) oder Rückgabe eines Zeigers auf statischen/dynamischen Speicher:
Vorteile:
Nachteile: