free fuer char *
-
hallo jungs und maedels...
hab da mal ne frage ..
ich habe ne c-struktur die ein feld hat welches ein string ist. sagen wir mal so:struct A { char *str_feld; };
und nun habe ich eine funktion die speicherplatz fuer diese struktur besorgt und nen zeiger darauf liefert sagen wir mal so (man achte auf param. der funktion):
...
struct A *new_A(char *schicker_str) { A *ptr2a = NULL; ptr2a = (A *) malloc(sizeof(A)); // hier checken ob ptr2a vielleicht NULL, wenn ja NULL zurueck .. ptr2a->str_feld = (char *)malloc(strlen(schicker_str) * sizeof(char)); // hier checken ob ptr2a-> vielleicht NULL, wenn ja free(ptr2a) und NULL-zurueck strcpy(ptr2a->str_feld, schicker_str); return ptr2a; }
...
Meine frage ist nun:
wenn ich solch ein A erstellt habe (zeiger darauf) und auch auf sein feld str_feld zugreifen kann (hat den gleichen wert wie schicker_str oben) dann ist es mir nicht moeglich beim loeschen der struktur durch z.B.:...
if(ptr2a!=NULL) if(ptr2a->str_feld!=NULL){free(ptr2a->str_feld); free(ptr2a);}
...
den string zu loeschen. Bei mir schmiert mein VC++ 6 dabei ab undzwar genau beim free(ptr2a->str_feld); ...nur warum??? der zeiger ist nicht null und hat den wert des strings bei der anlegung (siehe oben).Vielen Dank.
-
ok habs selber rausgefunden ...
aber wers wissen will:die allozierung des feldes str_feld muss in malloc mit strlen(schicker_str)+1 (!!!)
stattfinden (warum auch immer !?!)gruss
-
ich denke es liegt daran das du Speicher für einen String allociertst.
wenn du später mit strcpy arbeitest wird der String an den allocierten Speicher geschrieben + '/0'(die terminierende Null).wenn du jetzt den Speicher wieder freigibst, hängt an deinem String noch dieses terminierende Zeichen. Er will nun Speicher freigeben, jedoch ist dein String um eins länger wie der allocierte Speicher und das verurschat eine Speicherverletzung die wierum zu Laufzeitfehler führt.
servuz
...uncle sam