Pointer die Dritte



  • Ok ich arbeite mich gerade durch http://c.learncodethehardway.org/book 🙂
    Der Typ ist gut und von den roten Pillen möchte ich auch etwas. 😃

    Als Info : Ich nutze einen Microchip Compiler C30. Und programmiere einen PIC24FJ.
    Also embedded mit wenig RAM.

    Nun zu meiner Frage : Wie oder warum übergibt man und liefert struct's/arrays in Funktionen zurück.

    Ich habe eine Funktion die mir ein stuct zurückliefern soll. Z.B.

    typedef struct {
        int hour;
        int min;
    } time_s;
    

    Jetzt habe ich ja mehrere Möglichkeiten :

    1: Ich erzeuge das struct außerhalb der Funktion, setze einen Pointer darauf und übergebe diesen an die Funktion. Die manipuliert den Inhalt, Fertig;

    time_s time;
    time_s *time_p = &time;
    void foo(time_s *time, int hour, int min) {
        time_p->hour = hour;
        time_p->min = min;
    }
    

    2: Ich erzeuge das struct innerhalb der Funktion mit malloc() erledige meine Manipulationen gebe den Pointer auf das struct über die Funktion zurück. Hier dürfte ein heap Überlauf in der Folge sein, weil ich den Heap nicht wieder freigeben kann. 🙄

    3: Ich deklariere das struct und den pointer in der Funktion und wundere mich wenn im zurück gegebenen Pointer nicht gescheites steht, da beim Funktionsende ja auch die Variable freigegeben wird.

    time_s time;
    time_s *time_p;
    

    4: Wenn ich Variante 3 aber als static ausführe ?? Würde das dann funktionieren ?

    time_s *foo(int hour, int min){
        static time_s time;
        time_s *time_p;
        time_p->hour = hour;
        time_p->min = min;
        return time_p;
    }
    

    Grüße Hajo



  • 5. Du gibst die struct im Ganzen zurück

    time_s foo(int hour, int min){
        time_s time_p;
        time_p.hour = hour;
        time_p.min = min;
        return time_p;
    }
    

    Für dich, mit wenig Speicher, bietet sich Version 1 an.

    Was man macht, hängt auch von der Größe der struct ab.

    Ach ja, deine Frage: Ja, static geht.
    A B E R. wenn du die Funktion nochmal aufrufst, ändert sich auch der Inhalt für den ersten Aufruf.

    time_s *time_1, *time_2;
    
    time_1 = foo(12,0);
    time_2 = foo(24,0);
    
    printf("%d %d\n", time_1->hour, time_2->hour );
    

    Und das ist nicht so schön.



  • 1. ja.
    2. Was ist ein "heap überlauf"? Warum sollst du den Speicher nicht wieder freigeben können?
    3. genau.
    4. ja, aber siehe DirkB.


Anmelden zum Antworten