[C] free(): invalid next size (fast)

trench140

Mitglied
Hallo alle miteinander,

ich bastel gerade an einem Programm für die Uni herum und bekomme die folgende Fehlermeldung:

Code:
*** glibc detected *** ./main: free(): invalid next size (fast): 0x08214480 ***

Ich habe mein Programm nun einmal durchdebuggt und ich komme einfach nicht darauf, woran der Fehler liegt.

In meinem Programm setze ich zunächst folgende char-Arrays:

Code:
mainWindow->blog->blogTitle = "www.example.org/try";
mainWindow->blog->blogURL = "http://www.example.org/try/blog";

Diese werden anschließend an eine weitere Funktion übergeben. Diese habe ich inzwischen soweit auskommentiert, dass ich nur noch folgenden Inhalt drin stehen habe:

Code:
int readBlog(blog_t *blog)
{
    char *filename  = (char *)malloc(sizeof(char) * (strlen(blog->blogTitle) + 9));
    char *downloadURL = (char *)malloc(sizeof(char) * (strlen(blog->blogURL) + 9));
		
    sprintf(downloadURL,"%s/blog.xml",blog->blogURL);
    sprintf(filename,"/tmp/%s.xml",blog->blogTitle);

    free(downloadURL);
    free(filename);

    return 0;
}

Es knallt hierbei beim letzten free().

Nun habe ich mal verschiedene Werte für blogTitle und blogURL ausprobiert. Bei blogURL kann ich eingeben was ich will, das free wird korrekt ausgeführt. Beim free von "filename" knallt es hingegen, sobald ich >= 28 Zeichen eingebe.

Hat jemand eine Idee, wo der Fehler liegen könnte?
 
Nachdem ich jetzt anstatt "+9" mal "+10" versucht habe funktioniert es wieder.
Kann es sein, dass es daran liegt, dass ich für den '\0'-Character keinen Speicher alloziert habe? "+9" umfasste nur die Zeichen, die dem String im sprintf direkt hinzugefügt wurden.
Wobei mich dann wundert, dass es mit "downloadURL" funktionierte.
 
Nachdem ich jetzt anstatt "+9" mal "+10" versucht habe funktioniert es wieder.
Kann es sein, dass es daran liegt, dass ich für den '\0'-Character keinen Speicher alloziert habe? "+9" umfasste nur die Zeichen, die dem String im sprintf direkt hinzugefügt wurden.
Ja, das war vermutlich die Ursache der Fehlermeldung.

Wobei mich dann wundert, dass es mit "downloadURL" funktionierte.
Möglicherweise wurde nur der malloc-Deskriptor von filename überschrieben und der von downloadURL blieb zufällig von der Aktion unberührt. Das Verhalten kann aber auch von System zu System (oder sogar von Aufruf zu Aufruf) unterschiedlich sein, je nachdem welche Speicherbereiche durch die beiden mallocs reserviert werden.

Grüße, Matthias
 
Zurück