[Gelöst] free() invalid Pointer -- Pointer der von Funktion zurückgegeben wird
-
Hallo,
ich habe mir eine Funktion geschrieben, die ein char-Array übergeben bekommt und anhand eines Delimiters dieses char-Array zerlegt und mir die Teilstrings in einem 2-Dimensionalem Char-Array zurückgibt.
Da es nicht wirklich Sinn macht, bzw. nur Blödsinn bei rauskommt einen lokalen Pointer zurückzugeben (da dieser auf dem Stack liegt), lege ich das mehrdimensionale Array mit malloc() an und habe mir dazu noch eine Funktion geschrieben, die mir den ganzen Speicher wieder freigibt.
Problem ist, dass meine Funktion zum freigeben des Speichers einfach crasht und zwar beim ersten Aufruf von free(). Ich bin mit dem Debugger den ganzen Code durchgegangen und habe auch geprüft, ob in free() wirklich auch der Pointer landet, der mit malloc angelegt ist ...
Innerhalb meiner Funktion, in der ich das char-Array zerlege, kann ich den Speicher auch noch wunderbar freigeben, nur sobald ich den Pointer returne, geht es einfach nicht mehr (obwohl sich im Grunde nichts ändert).
Er bricht mit der Warnmeldung "Invalid Pointer" ab.
*** glibc detected *** /home/test/Arbeitsfläche/Projects/Betriebssysteme/SHELL-RBN-OS-1/bin/Debug/SHELL-RBN-OS-1: free(): invalid pointer: 0x0000000000b6e390 ***
Ich vermute, es ist eine Eigenart von C, die ich nicht kenne oder ein grober Fehler.
char ** explodeString(char * paramStr, char * deli, int * anzParam) { int i = 0, chk = 0; char ** explStr = NULL; char * ptr; char modi[WOLFV_MAXARR_TXT]; *anzParam = 0; for(;paramStr[i] != '\0'; i++) { if(chkTkn(paramStr[i], deli) && !chk) { ++(*anzParam); chk = 1; } else if(paramStr[i] != ' ') { chk = 0; } } if(i > 0) { ++(*anzParam); explStr = malloc((*anzParam + 1) * sizeof(char*)); for(i = 0; i < *anzParam; i++) { explStr[i] = malloc(WOLFV_MAXARR_TXT * sizeof(char)); } explStr[*anzParam+1] = NULL; strcpy(modi, paramStr); ptr = strtok(modi, deli); i = 0; while(ptr != NULL) { trim(explStr[i]); strcpy(explStr[i], ptr); ++i; ptr = strtok(NULL, deli); } } return explStr; } void freeExplArr(char ** expl) { unsigned int i; free(expl[0]); for(i = 0; expl[i] != NULL; i++) { free(expl[i]); } free(expl); }
Aufrufen tue ich den Code so:
char input[1024] = ""; char ** explArr; char * ext = NULL; int countArg; readInput(input); /* zB Hello World */ trim(input); explArr = explodeString(input, " ", &countArg); freeExplArr(explArr);
Hoffe, mir kann jemand helfen.
Liebe Grüße und Danke!
Edit: Compiler Flags: -g -Wall -Wextra -pedantic
-
Fru schrieb:
Ich vermute, es ist eine Eigenart von C, die ich nicht kenne oder ein grober Fehler.
Der Compiler hat immer recht, insbesondere hat der C Standard immer recht.
if(i > 0) { ++(*anzParam); explStr = malloc((*anzParam + 1) * sizeof(char*)); for(i = 0; i < *anzParam; i++) { explStr[i] = malloc(WOLFV_MAXARR_TXT * sizeof(char)); } explStr[*anzParam+1] = NULL;
Hier liegt ein Hund begraben.
Die NULL (Ende)Kennzeichnung muss natürlich bei *anzParam liegen und nicht bei *anzParam+1. Beim Zugrifffree(explStr[*anzParam])
ist dann "Invalid Pointer" leicht erklärlich.
Das kann man vermeiden durchexplStr = calloc(*anzParam + 1,sizeof*explStr);
-
Ich meinte einen groben Fehler von mir, nicht vom Compiler.
Danke erst einmal für deine Antwort.Allerdings bricht er mit invalid Pointer bereits bei param[0] ab und bei malloc() allkokiere ich bereits anzParam + 1 mehr.
explStr = malloc((*anzParam + 1) * sizeof(char*));
Durchgehe in der Schleife beim restlichen allokieren nur von 0 bis i < *anzParam.
Lasse mir also einen am Ende übrig, denn ich mit NULL als Ende markieren kann.
-
Jap, ich gebe dir recht: Es muss natürlich explStr[*anzparam] sein -- das war tatsächlich ein Fehler. Habe das korrigiert. Habe malloc durch calloc ausgetauscht, aber der Fehler besteht weiterhin (mein malloc und dein calloc müsste, bis auf die 0-Bit Initialisierung doch auch auch äquivalent sein?).
Edit: Okay, bei der Fehlersuche ist noch ein free(param[0]) übrig geblieben, was ich nu entfernt habe, nun habe ich keinen invalid Pointer Fehler mehr. Vielen dank..