Menu
Coddy logo textTech

Stack-Initialisierung

Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy. Lektion 14 von 61.

Nicht jedes Objekt muss auf dem Heap leben. Wenn eine struct klein ist und eine kurze Lebensdauer hat, ist es einfacher und schneller, sie auf dem Stack zu reservieren: kein malloc, kein free, kein Risiko von Speicherlecks.

Statt einen Zeiger zurückzugeben, kann eine Factory-Funktion die Struktur als Wert zurückgeben. Die gesamte Struktur wird an den Aufrufer kopiert:

typedef struct {
    int x;
    int y;
} Point;

Point create_point(int x, int y) {
    Point p;
    p.x = x;
    p.y = y;
    return p;
}

Der Aufrufer erhält eine vollständig initialisierte Kopie:

Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);

Keine Zeiger, keine Bereinigung erforderlich. Wenn origin und cursor den Gültigkeitsbereich verlassen, werden sie automatisch zerstört.

Dieser Ansatz eignet sich am besten für kleine structs ohne dynamisch zugewiesene Member. Für größere Objekte oder solche, die Zeiger auf Heap-Speicher enthalten, bleibt das Konstruktormuster mit malloc die bessere Wahl.

challenge icon

Aufgabe

Einfach

Lass uns ein Temperature-Modul erstellen, das Temperaturmesswerte mithilfe einer Factory-Funktion auf dem Stack erzeugt. Im Gegensatz zu den heap-basierten Konstruktoren aus vorherigen Lektionen gibt dieser Ansatz die Struktur als Wert zurück: kein malloc, kein free, sondern einfach eine effiziente Stack-Allokation.

Du wirst drei Dateien erstellen:

  • temperature.h: Deklariere eine Temperature-Struktur mit zwei Mitgliedern: double celsius und char scale (um 'C' für Celsius zu speichern). Deklariere außerdem zwei Funktionen:
    • create_temperature: nimmt einen double-Wert entgegen und gibt eine Temperature-Struktur als Wert zurück (keinen Pointer!)
    • temperature_to_fahrenheit: nimmt einen const Temperature * entgegen und gibt die entsprechende Temperatur in Fahrenheit als double zurück
    Verwende Include-Guards mit dem Symbol TEMPERATURE_H.
  • temperature.c: Implementiere beide Funktionen. Deine Factory-Funktion sollte eine lokale Temperature-Variable erstellen, ihre Felder initialisieren (scale auf 'C' setzen) und sie zurückgeben. Die Umrechnungsformel lautet: fahrenheit = celsius * 9.0 / 5.0 + 32.0
  • main.c: Verwende deine Factory-Funktion, um einen Temperaturmesswert zu erstellen, und zeige sowohl die Celsius- als auch die Fahrenheit-Werte an.

Du erhältst eine Eingabe: die Temperatur in Celsius (als double).

Verwende in deiner Hauptdatei create_temperature, um mit dem gegebenen Wert eine Temperature-Struktur zu erstellen. Gib anschließend den ursprünglichen Celsius-Wert und sein Fahrenheit-Äquivalent aus.

Gib die Ausgabe in diesem Format aus:

Celsius: {celsius}
Fahrenheit: {fahrenheit}

Verwende %.2f für beide Werte, um zwei Dezimalstellen anzuzeigen.

Bei einer Eingabe von 25.0 würde die Ausgabe beispielsweise so aussehen:

Celsius: 25.00
Fahrenheit: 77.00

Beachte, wie sauber dieser Ansatz ist. Du erhältst eine vollständig initialisierte Struktur, ohne dir Gedanken über Speicherverwaltung machen zu müssen. Wenn deine Temperature-Variable ihren Gültigkeitsbereich verlässt, wird sie automatisch bereinigt.

Probier es selbst

#include <stdio.h>
#include "temperature.h"

int main() {
    double celsius_input;
    scanf("%lf", &celsius_input);
    
    // TODO: Verwende create_temperature, um ein Temperature-Struct zu erstellen
    
    // TODO: Gib den Celsius-Wert im Format %.2f aus
    
    // TODO: Verwende temperature_to_fahrenheit, um den Fahrenheit-Wert umzurechnen und auszugeben
    
    return 0;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Object Oriented Programming

Übe selbstständig: Online-C-Compiler