malloc() in funktionen



  • Hallo!

    Ich weiß, dass eine funktion keine zeiger auf lokale variablen zurpckgeben kann bzw. es nicht tun sollte. 😃
    Jetzt hab ich unteranderem folgendes als workaround gelesen und verstehe nicht was daran viel besser ist:

    char *test(void){
       char *buffer = (char *) malloc(10);
       strcpy(buffer, "testwert");
       return buffer;
    }
    

    Der allokierte speicher wird ja dann nicht mehr freigegeben, oder doch?
    Wenn ja (da lokale objekte ja nur bis zum ende der funktion überleben) ist ja wiederrum buffer ein ungültiger pointer... 😕

    MfG,

    fragender



  • Die Variable buffer überlebt nicht, aber ihr Inhalt schon. Du musst den Speicher aber trotzdem freigeben wenn er nicht mhr gebraucht wird.



  • hm... ok danke mallocator(geiler name :D). dacht ich mir ja schon... also is das auch keine richtige lösung. kann man das problem sonst irgendwie umschiffen außer mit ner static variable?



  • Mister C schrieb:

    hm... ok danke mallocator(geiler name :D). dacht ich mir ja schon... also is das auch keine richtige lösung. kann man das problem sonst irgendwie umschiffen außer mit ner static variable?

    kann dein problem nicht nachvollziehen, und wozu eine statische variable gut sein sollte

    char *test(void){
       char *buffer = (char *) malloc(10); // buffer zeigt jetzt auf speicher am heap;
       strcpy(buffer, "testwert");         // copiere konstanten string nach heap
       return buffer;                      // gib den ort am heap zurück;
    } 
    
    int main() {
      char * a = test(void);               // a zeigt jetzt auf den heap
      do_some_thing( a );                  // verwende a        
      free( a );                            // speicher freigeben
    }
    


  • ZuK schrieb:

    char *buffer = (char *) malloc(10); // buffer zeigt jetzt auf speicher am heap;
    

    Ist der cast nicht überflüssig?



  • Kann schon sein. Bringe c und c++ immer durcheinander.
    Kurt



  • cd9000 schrieb:

    ZuK schrieb:

    char *buffer = (char *) malloc(10); // buffer zeigt jetzt auf speicher am heap;
    

    Ist der cast nicht überflüssig?

    Manche IDE´s wie Visual Studio meckern, wenn man den cast nicht angibt.
    Sonst ist er überflüssig.



  • diese C++ programmierer immer - kennen nicht mal long long 😉 - der cast ist sinnlos



  • curry-king schrieb:

    cd9000 schrieb:

    ZuK schrieb:

    char *buffer = (char *) malloc(10); // buffer zeigt jetzt auf speicher am heap;
    

    Ist der cast nicht überflüssig?

    Manche IDE´s wie Visual Studio meckern, wenn man den cast nicht angibt.

    Die IDE meckert? Ich dachte dafür wäre der Compiler zuständig? 😕

    Außerdem meckert der C-Compiler von MS Visual Studio afaik nicht, wenn der cast fehlt.



  • cd9000 schrieb:

    curry-king schrieb:

    cd9000 schrieb:

    ZuK schrieb:

    char *buffer = (char *) malloc(10); // buffer zeigt jetzt auf speicher am heap;
    

    Ist der cast nicht überflüssig?

    Manche IDE´s wie Visual Studio meckern, wenn man den cast nicht angibt.

    Die IDE meckert? Ich dachte dafür wäre der Compiler zuständig? 😕

    Außerdem meckert der C-Compiler von MS Visual Studio afaik nicht, wenn der cast fehlt.

    Nagut, der Compiler von MS Visual Studio.... Aber er meckert trotzdem!

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
    	char *c;
    
    	c=malloc(sizeof(char));
    
    	*c='a';
    
    	printf("%c\n", *c);
    
    return 0;
    }
    
    --------------------Konfiguration: Cpp1 - Win32 Debug--------------------
    Kompilierung läuft...
    Cpp1.cpp
    C:\Dokumente und Einstellungen\michi\Desktop\Neuer Ordner\Cpp1.cpp(9) : error C2440: '=' : 'void *' kann nicht in 'char *' konvertiert werden
            [b]Konvertierung von 'void*' in Zeiger auf nicht-'void' erfordert eine explizite Typumwandlung[/b]
    Fehler beim Ausführen von cl.exe.
    
    Cpp1.exe - 1 Fehler, 0 Warnung(en)
    

    Mit cast gibts keine Meldungen!



  • Trotzdem meckert nicht der c-compiler sondern der c++ compiler. wenn mich nicht alles täuscht dann erkennt die vc-IDE an der file-extension ( bei dir .cpp ) welcher compiler verwendet wird ( ändere mal die extension auf .c und der compiler wird aufhören zu meckern ).
    Andererseits ist es wirklich nicht einfach nachzuvollziehen was wann aus der VC-IDE aufgerufen wird. Ich habe vor einiger zeit einmal den linker von vc gesucht und keinen gefunden.( microsoft-magic ? ).
    Kurt



  • ok, danke für die Klarstellung!



  • free() nicht vergessen



  • ZuK schrieb:

    char *buffer = (char *) malloc(10); // buffer zeigt jetzt auf speicher am heap;
    

    Ist der cast nicht überflüssig?

    soweit ich weiß ist er in C überflüssig aber nicht in C++.

    zur eigentlichen frage: besser ist es, wenn der speicher in der selben funktion freigegeben wird in der er alloziert wurde:

    char *test(char *buffer)
    {
      strcpy(buffer,"testwert");    // kopiere konstanten string nach buffer
      return buffer;                // gib den ort am heap zurück;
    } 
    
    int main()
    {
      char *a=(char*)malloc(10);    // buffer zeigt jetzt auf speicher am heap;
      test(a);                      // kopiere konstanten string nach a
      do_some_thing(a);             // verwende a
      free(a);                      // speicher freigeben
    }
    


  • ja und genau das ist ja mein problem: ich find es z.b. sehr lästig und nicht grad guten stil wenn man eine funktion aufruft und sich dann auch noch darum kümmern muss den speicher wieder freizugeben. kann man das nicht noch irgendwie anders machen?
    mit der static variable meinte ich, dass man ein char array als static in der funktion deklariert und darauf den pointer zurückgibt. aber das find ich auch nicht als optimale lösung... 😕
    gibt es denn keine "richtige" möglichkeit einen string bzw ein char array zurückzugeben?



  • Konfusius schrieb:

    ZuK schrieb:

    char *buffer = (char *) malloc(10); // buffer zeigt jetzt auf speicher am heap;
    

    Ist der cast nicht überflüssig?

    soweit ich weiß ist er in C überflüssig aber nicht in C++.

    Bingo. Schau mal auf den Titel dieses Unter-Forums. 🙂


Anmelden zum Antworten