free(): invalid next size (normal)
-
Hallo ich schreibe gerade wegen Studium eine Funktion, die eine Umgebungsvariable aus der Liste der UV entfernen soll und bin dabei auf die im Titel angegebene Fehlermeldung gestoßen!
Die Funktion hat allgemein funktioniert als ich noch kein malloc gemacht habe, das Problem beim unten stehende Code ist aber, dass man neuen Speicher (lt. Angabe) allokieren muss, wenn der zu überschreibende String-Speicher zu klein ist, da sonst teile der Variablennamen abgeschnitten werden...also hier mal die Funktion:
bool RemoveEntry(char ** env, char * elem) { /* Löschen eines Namens • Hier muss in der Environment-Liste der entsprechende Zeiger gefunden werden, danach werden die darauffolgenden Zeiger um eine Stelle nach vorne verschoben und das neue Ende entsprechend mit 0 abgeschlossen. */ if(env == 0) { fprintf(stderr, "Null Pointer Parameter in RemoveEntry\n"); return false; } char ** envNext = env; while(*env != 0) { if(*envNext != 0) ++envNext; // Erhöhen des NextPTR if(strcmp(*env, elem) == 0) // elem gefunden { while(*env != 0) { if(*envNext != 0) { if(strlen(*envNext) <= strlen(*env)) { strcpy(*env, *envNext); // elem überschreiben } else { char * ch = (char*) malloc(sizeof(*envNext)); // Fehler is hier memcpy(ch, *envNext, strlen(*envNext)); // free invalid pointer? *env = ch; } ++envNext; } ++env; } } if(*env != 0) ++env; // Erhöhen des envPTR } return true; }
Ich benutze im Programm eigentlich KEIN free! Liegts an einem dangling Pointer? Ich kann en Fehler einfach nicht finden -,-
Schonmal danke an alle die sich die Mühe machen!
-
allokierst du bei
char * ch = malloc(sizeof(*envNext));
genug speicher, denn du allokierst nur sizof(char*) speicher
edit: aber brauchst strlen(*envNext)+1 speicher wenn ich das richtig seheHinweis in C solltest du den Rückgabewert von malloc sowie alle void* zugunsten der Typ-Prüfung nicht casten
-
gary1195 schrieb:
allokierst du bei
char * ch = malloc(sizeof(*envNext));
genug speicher, denn du allokierst nur sizof(char*) speicher
edit: aber brauchst strlen(*envNext)+1 speicher wenn ich das richtig seheHinweis in C solltest du den Rückgabewert von malloc sowie alle void* zugunsten der Typ-Prüfung nicht casten
Hallo! Danke für deine schnelle Antwort!
War ein echt blöder fehler, konnt ihn aber iwie nicht sehenVerbesserungsvorschlag eingebaut und alles läuft wies soll!
char * ch = malloc(strlen(*envNext));
-
Vorsicht:
du hast bei malloc und memcpy vergessen das nullbyte zu berücksichtigen