Menu
Coddy logo textTech

Inicjalizacja na stosie

Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 14 z 61.

Nie każdy obiekt musi znajdować się na stercie. Gdy struktura jest mała i ma krótki czas życia, przydzielenie jej na stosie jest prostsze i szybsze: bez malloc, bez free i bez ryzyka wycieków pamięci.

Zamiast zwracać wskaźnik, funkcja fabrykująca może zwrócić strukturę przez wartość. Cała struktura zostaje skopiowana do wywołującego:

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

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

Wywołujący otrzymuje w pełni zainicjalizowaną kopię:

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

Brak wskaźników, brak konieczności sprzątania. Gdy origin i cursor wyjdą poza zakres, zostaną automatycznie zniszczone.

To podejście sprawdza się najlepiej w przypadku małych struktur bez dynamicznie alokowanych składowych. W przypadku większych obiektów lub tych zawierających wskaźniki do pamięci sterty lepszym wyborem pozostaje wzorzec konstruktora z użyciem malloc.

challenge icon

Wyzwanie

Łatwy

Zbudujmy moduł Temperature, który tworzy odczyty temperatury na stosie za pomocą funkcji fabrykującej. W przeciwieństwie do konstruktorów opartych na stercie z poprzednich lekcji, to podejście zwraca strukturę przez wartość: bez malloc, bez free, po prostu prosta i wydajna alokacja na stosie.

Utworzysz trzy pliki:

  • temperature.h: Zadeklaruj strukturę Temperature z dwoma polami: double celsius i char scale (do przechowywania 'C' oznaczającego stopnie Celsjusza). Zadeklaruj też dwie funkcje:
    • create_temperature: przyjmuje wartość typu double i zwraca strukturę Temperature przez wartość (a nie wskaźnik!)
    • temperature_to_fahrenheit: przyjmuje const Temperature * i zwraca równoważną temperaturę w stopniach Fahrenheita jako wartość typu double
    Użyj strażników nagłówka z symbolem TEMPERATURE_H.
  • temperature.c: Zaimplementuj obie funkcje. Funkcja fabrykująca powinna utworzyć lokalną zmienną Temperature, zainicjalizować jej pola (ustawić scale na 'C') i ją zwrócić. Wzór na konwersję to: fahrenheit = celsius * 9.0 / 5.0 + 32.0
  • main.c: Użyj funkcji fabrykującej, aby utworzyć odczyt temperatury i wyświetlić wartości w stopniach Celsjusza i Fahrenheita.

Otrzymasz jedno wejście: temperaturę w stopniach Celsjusza (jako wartość typu double).

W pliku głównym użyj create_temperature, aby utworzyć strukturę Temperature z podaną wartością. Następnie wypisz pierwotną wartość w stopniach Celsjusza i jej odpowiednik w stopniach Fahrenheita.

Wypisz dane wyjściowe w tym formacie:

Celsius: {celsius}
Fahrenheit: {fahrenheit}

Użyj %.2f dla obu wartości, aby wyświetlić je z dwoma miejscami po przecinku.

Na przykład dla wejścia 25.0 dane wyjściowe wyglądałyby tak:

Celsius: 25.00
Fahrenheit: 77.00

Zwróć uwagę, jak przejrzyste jest to podejście. Otrzymujesz w pełni zainicjalizowaną strukturę bez martwienia się o zarządzanie pamięcią. Gdy zmienna Temperature wyjdzie poza zakres, zostanie automatycznie posprzątana.

Spróbuj swoich sił

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

int main() {
    double celsius_input;
    scanf("%lf", &celsius_input);
    
    // TODO: Użyj create_temperature, aby utworzyć strukturę Temperature
    
    // TODO: Wypisz wartość w stopniach Celsjusza w formacie %.2f
    
    // TODO: Użyj temperature_to_fahrenheit, aby przeliczyć i wypisać wartość w stopniach Fahrenheita
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online