C/C++: free -> Fehler
Tina
- programmiertechnik
Moin,
leider führt der free() Befehl zu einem unangenehmen Fehler, der sich nicht beheben lassen will, sodass ich nun Euch um Rat fragen möchte.
Die Source enthält u.a.:
char b=0;
char *a;
a=(char*) malloc(b);
free(anfang);//<- passierts: run-time check failure #2 stack around the variable 'b' was corrupted
Hoffe, Ihr wisst, was daran nicht passt.
Danke schonmal
Moin,
Die Source enthält u.a.:
char b=0;
char *a;
a=(char*) malloc(b);
free(anfang);//<- passierts: run-time check failure #2 stack around
the variable 'b' was corrupted
Ich denke mal, anfang soll a heißen, oder? Ansonsten gibt bitte den Codeteil an, aus dem anfang stammt.
Ansonsten ist der Fehler für mich klar:
char b = 0;
Hier bekommt b den Wert 0.
a = (char *)malloc(b);
Hier rufst du malloc auf. b hat den Wert 0. Ergo steht dort malloc(0).
Daher dürfte gar kein Speicher reserviert werden...
free(a);
Hier willst du einen Speicherbereich der Länge 0 freigeben. Das MUSS schiefgehen.
Keiner Tipp noch: Insbesondere bei C-Strings würde ich nicht mit malloc arbeiten, sondern mit calloc. Z.B. reserviert dir
char *str;
str = calloc(256, sizeof(char));
Speicher für einen String mit 255 Zeichen (das letzte ist für '\0'). Netterweise setzt calloc auch noch alles auf '\0', so dass der String in jedem Fall terminiert ist. Bei malloc ist der Zustand des Speichers nicht definiert. Bei malloc musst du noch ein memset hinterhermachen.
Gruß
Stareagle
Hallo,
char b = 0;
>
> Hier bekommt b den Wert 0.
>
> ~~~c
> a = (char *)malloc(b);
>
Hier rufst du malloc auf. b hat den Wert 0. Ergo steht dort malloc(0).
Daher dürfte gar kein Speicher reserviert werden...
Jain. Laut Standard ist es der Implementierung überlassen, ob sie bei malloc(0) KEINEN Speicher reserviert und NULL) zurückgibt - was dann zu einem Fehler führt ODER ob sie tatsächlich einen 0 Byte großen Speicherbereich reserviert, der dann auch zurückgegeben wird und per free() wieder freigegeben werden kann/muss.
Da das aber wie gesagt der Implementierung überlassen ist, würde ich malloc() definitiv NIE 0 übergeben wollen.
Viele Grüße,
Christian
moin, moin
> char b=0;
> char *a;
> a=(char*) malloc(b);
> free(anfang);//<- passierts: run-time check failure #2 stack around the variable 'b' was corrupted
sollte b nicht besser vom Typ int oder unsigned int sein und b>0
?
Gruß plan_B
Hi Tina,
char b=0;
char *a;
a=(char*) malloc(b);
free(anfang)
du hast ja schon einige Tipps bekommen.
Die dynamische Speicherbeschaffung ist eine tolle Sache, jedoch sollte man dort auch sehr defensiv programmieren. Es kann viel schief gehen, wie du gemerkt hast.
Sollten Zeiger immer mit NULL inisaliziert werden
also char *a = NULL;
Die Speicherbeschaffung kann schief gehen, also immer prüfen
a=(char*) malloc(b);
if ( a == NULL ){
exit(EXIT_FAILURE);
}
MfG
Otto