Alloziierter Speicher



  • Hi,
    Wenn ich in einer Funktion Speicher reserviere, wird der nach Beendigung der Funktion freigegeben? Ich tippe mal auf nein. Wie löse ich das wenn ich die Struktur als Rückgabewert habe?
    Gruß HiFish

    struct time * zeitums(char *time)
    {	
    	struct time *tt=(struct time *)malloc(sizeof(struct time));
    	int hr=0,mn=0,sc=0;
    	sscanf(time,"%d:%d:%d",&hr,&mn,&sc);
    	tt->hr=hr;
    	tt->mn=mn; 
    	tt->sc=sc;
    	return(tt);
    }
    


  • lass es doch aufm stack liegen ich seh da irgendwie keinen sinn dynamisch zu allozieren, nach dem return wird tt dann sowieso zerstört..und zeiger auf locale variablen zurückzugeben ist nicht grade gut..

    struct time zeitums(char *time)
    {   
        struct time tt;
        int hr=0,mn=0,sc=0;
        sscanf(time,"%d:%d:%d",&hr,&mn,&sc);
        tt->hr=hr;
        tt->mn=mn;
        tt->sc=sc;
        return(tt);
    }
    


  • ja gute idee danke 🙂



  • electric_juice schrieb:

    struct time zeitums(char *time)
    {   
        struct time tt;
        int hr=0,mn=0,sc=0;
        sscanf(time,"%d:%d:%d",&hr,&mn,&sc);
        tt->hr=hr;
        tt->mn=mn;
        tt->sc=sc;
        return(tt);
    }
    

    eher so...

    struct time zeitums (char *time)
    {  
        struct time tt;
        sscanf (time,"%d:%d:%d",&tt.hr,&tt.mn,&tt.sc);
        return tt;
    }
    


  • Return ist eine Anweisung. Soweit ich weiß, kannst Du in C in einer Struktur nur Variablen, Zeiger und Arrays ablegen, aber keine Anweisungen. Die gehören in die Funktion. (Wie es mit Funktionszeigern steht, weiß ich nicht- dann wäre man ja schon sehr nahe an der OOP)
    Wenn der alloziierte Speicher vor dem Ende der Funktion nicht freigegeben wird, produzierst Du Speicherleaks. Je nachdem, wie Du alloziierst, kannst Du (nach malloc) mit free, oder (nach new) mit delete freigeben. Den dazugehörigen Zeiger unbedingt auf NULL setzen.



  • Elektronix schrieb:

    Return ist eine Anweisung. Soweit ich weiß, kannst Du in C in einer Struktur nur Variablen, Zeiger und Arrays ablegen, aber keine Anweisungen. Die gehören in die Funktion.

    tt ist halt eine Variable vom typ return 🤡

    Im Ernst: Das ist schon eine Funktion.

    Elektronix schrieb:

    (Wie es mit Funktionszeigern steht, weiß ich nicht- dann wäre man ja schon sehr nahe an der OOP)

    Da Funktionszeiger auch nur Zeiger sind, geht das natürlich.



  • Elektronix schrieb:

    Return ist eine Anweisung. Soweit ich weiß, kannst Du in C in einer Struktur nur Variablen, Zeiger und Arrays ablegen, aber keine Anweisungen. Die gehören in die Funktion.

    das sind auch funktionen (die geben eine 'struct time' zurück).



  • net schrieb:

    das sind auch funktionen (die geben eine 'struct time' zurück).

    TactX schrieb:

    Im Ernst: Das ist schon eine Funktion.

    Was ist denn jetzt gemeint mit "Das"?

    TactX schrieb:

    Da Funktionszeiger auch nur Zeiger sind, geht das natürlich.

    Ah, cool! 🕶 Wie greift man dann auf diese Funktion zu, bzw. wie übergibt man Parameter dazu? Und wo landet der Rückgabewert?(eben speziell Funktionen, die über einen Zeiger in einer Struktur aufgerufen werden!)? Sowas findet man nämlich in keinem Tutorial und keinem Buch.



  • Elektronix schrieb:

    net schrieb:

    das sind auch funktionen (die geben eine 'struct time' zurück).

    TactX schrieb:

    Im Ernst: Das ist schon eine Funktion.

    Was ist denn jetzt gemeint mit "Das"?

    Eigentlich sämtlicher Code in diesem Thread 😉

    Elektronix schrieb:

    TactX schrieb:

    Da Funktionszeiger auch nur Zeiger sind, geht das natürlich.

    Ah, cool! 🕶 Wie greift man dann auf diese Funktion zu, bzw. wie übergibt man Parameter dazu? Und wo landet der Rückgabewert?(eben speziell Funktionen, die über einen Zeiger in einer Struktur aufgerufen werden!)? Sowas findet man nämlich in keinem Tutorial und keinem Buch.

    Eigentlich ist das recht logisch:

    var = struct_foo.func(bar, baz);
    // bzw. wenn Zeiger auf Struktur
    var = ptr_struct_foo->func(bar, baz);
    

    Eigentlich genau so wie man es aus C++ kennt.

    Edit: Achja, wer es noch nicht wusste: Heute ist "Eigentlich"-Tag 😃 🤡



  • Elektronix schrieb:

    Wie greift man dann auf diese Funktion zu, bzw. wie übergibt man Parameter dazu? Und wo landet der Rückgabewert?

    etwa so:

    struct time the_time;
    the_time = zeitums();
    

    dabei werden alle members aus der funktion rüberkopiert. braucht sich der anwender nicht drum zu kümmern...



  • Besten Dank, Leudz, wieder was gelernt 👍 😋 . Kennt vielleicht jemand einen guten Text (Tut), der das Thema noch etwas vertieft? Dann kann ich ein bißchen damit herumspielen.


Anmelden zum Antworten