Wie gebe ich Speicher, den ich in einer Funktion reserviert habe, in main frei?



  • Folgends Programm führt zu einem Segfault:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char* func(char s[]);
    
    int main()
    {
      char s[] = "Test";
      char* p;
      p = func(s);
    
      printf("%s %p  %s\n", s, p, p);
      free(p);
    
      return 0;
    }
    
    char* func(char s[])
    {
    	char *ptr = malloc(10 * sizeof (char));
        ptr = "Hausbau\n";
        s = ptr;
    	printf("%s %p\n", s, s);
        return s;
    }
    

    wie kann in in Zeile 14 den Speicher wieder freigeben?



  • Indem du

    strcpy(ptr , "Hausbau\n");
    

    verwendest.



  • Auf Zeile 22 bekommst die Adresse des Anfansg des Blocks mit dem reservierten Speicher. Auf Zeile 23 überschreibst du diese Adresse durch eine andere, ptr zeigt dann auf Read-Only Memory, was du nicht freigeben kannst/darfst. --> segfault



  • In der second Funktion allozierst du Speicher und in der main gibst du ihn wider frei. Denke daran, dass bei einem grösseren Projekt, dies sehr unübersichtlich ist.



  • supertux schrieb:

    Auf Zeile 22 bekommst die Adresse des Anfansg des Blocks mit dem reservierten Speicher. Auf Zeile 23 überschreibst du diese Adresse durch eine andere, ptr zeigt dann auf Read-Only Memory, was du nicht freigeben kannst/darfst. --> segfault

    Ach so.
    hast Recht, ich dachte der String Hausbau wird einfach an den von ptr freigegebenen Speicherplatz kopiert.
    So kann das natürlich nicht funktionieren und strcpy ist die lösung. Thx.

    -lowbyte- schrieb:

    In der second Funktion allozierst du Speicher und in der main gibst du ihn wider frei. Denke daran, dass bei einem grösseren Projekt, dies sehr unübersichtlich ist.

    Schon klar, mir ging es nur um die Prinzipfrage um zu sehen, ob so etwas überhaupt machbar ist.

    Denn normalerweise ist in einer Funktion reservierter Speicher nur lokal.
    Und da hab ich mich halt gefragt, was passieren würde, wenn ich diesen lokalen Speicher mit nem Pointer nach draußen schaffe.



  • Gastomat schrieb:

    Und da hab ich mich halt gefragt, was passieren würde, wenn ich diesen lokalen Speicher mit nem Pointer nach draußen schaffe.

    Dann mußt du aber auch

    return ptr;
    

    schreiben.


Anmelden zum Antworten