In der Programmiersprache C werden Variablen mit automatischem Speicherbereich (auto, standardmäßig) auf dem Stack beim Betreten des Sichtbarkeitsbereichs (normalerweise einer Funktion) erstellt und automatisch beim Verlassen dieses Bereichs zerstört.
Zu den Besonderheiten gehören:
Beispiel für korrekte und inkorrekte Nutzung:
int* wrong() { int x = 42; return &x; // FEHLER: x wird nach Verlassen der Funktion zerstört } void correct() { int y = 123; printf("%d\n", y); // alles gut }
Was passiert, wenn die Adresse einer lokalen Variable aus einer Funktion zurückgegeben wird?
Häufige falsche Antwort: „Der Zeiger behält den Wert.“
Richtige Antwort: Die zurückgegebene Adresse wird ungültig, nachdem die Funktion verlassen wurde, der Speicherbereich wird erneut für andere automatische Variablen oder Funktionen zugewiesen. Die Verwendung eines solchen Zeigers führt zu undefiniertem Verhalten.
Beispiel:
int* myfunc() { int temp = 10; return &temp; // temp wird nach der Rückgabe zerstört } int main() { int* p = myfunc(); printf("%d\n", *p); // Undefiniertes Verhalten }
Geschichte
Geschichte
Geschichte
In der Firmware eines medizinischen Registrators wurde ein Cache auf dem Stack zur Beschleunigung der Datenverarbeitung implementiert. Unter Last überlief der Stack, was zu einem Neustart des Geräts und zum Verlust von Patientendaten führte.