Hallo,
neues Problem neuer Beitrag...
Um eine Datei in einen String einzulesen alloziere ich Speicher mit
malloc(). Wenn ich den Speicher mit free() am ende des Programms wieder
freigeben möchte, springt das Programm (beim debuggen) in folgenden
Handler:
Robert B. schrieb:> plaindata = (char *)malloc(datasize);> fscanf(input, "%s", plaindata);
fscanf schreibt am ende ein 0 Byte in den "String" so viel platz ist
dort aber nicht.
du brauchst 1 Byte mehr speicher, außerdem würde ich read statt fscanf
verwenden.
Danke für den Hinweis! Leider löst das nicht mein Problem. Ich debugge
Schritt für Schritt und erst wenn ich die Funktion free() erreiche
springt das Programm in den Handler.
Robert B. schrieb:> Ich debugge> Schritt für Schritt und erst wenn ich die Funktion free() erreiche> springt das Programm in den Handler.
wenn du den Speicher überschreibt kann das Problem irgendwo auftauchen
und nicht an eine genauen stelle.
Peter II schrieb:> wenn du den Speicher überschreibt kann das Problem irgendwo auftauchen> und nicht an eine genauen stelle.
Kannst du das genauer beschreiben? Also klar, wenn ich den Speicher
überschreibe gibt's Probleme. Aber in meinem Programm überschreibe ich
doch nichts, oder?
Hast du schonmal überprüft ob malloc überhaupt Speicher bereitstellt
(plaindata != NULL)? Mein Tipp ist, dass ftell als Ergebnis 0 liefert,
da du am Anfang der Datei stehst.
Robert B. schrieb:> Kannst du das genauer beschreiben? Also klar, wenn ich den Speicher> überschreibe gibt's Probleme. Aber in meinem Programm überschreibe ich> doch nichts, oder?
doch denke schon, denn mit %s liest man eine String ein und am ende wird
ein 0 Byte eingefügt dafür hast du aber kein Platz mehr.
Wird calloc anstelle von malloc verwendet, ist der Speicher bereits
Null-Initialisiert, und man kann das nachträgliche Setzen der '\0' nicht
versehentlich vergessen:
Ich glaube die Ursache warum das erst beim free() zu einem Fehler führt
ist daß im Debug Modus eine magic number hinter den allozierten
Speicherblock gepackt wird und free das prüft und dabei den
Überschreiber bemerkt.
Rufus Τ. Firefly schrieb:> Wird calloc anstelle von malloc verwendet, ist der Speicher bereits> Null-Initialisiert, und man kann das nachträgliche Setzen der '\0' nicht> versehentlich vergessen:> plaindata = (char *) calloc(datasize + 1, sizeof (char));> fread(plaindata, sizeof (char), datasize, input);>> // kann wegfallen> plaindata[datasize] = '\0';
finde ich aber hierfür nicht sinnvoll. Es nur Resourcenverschwendung, da
der Speicher danach eh mit Inhalt gefüllt wird.