PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C - glibc detected - malloc() memory corruption



joker1025
28-04-2008, 16:12
Hi,

weis leider nicht mehr weiter, kann mir vlt. irgendjemand erklären warum bei diesem Programmabschnitt eine Speicherallokierung fehlschlägt? Ich habe den Fehler soweit eingegrenzt, dass der Fehler in der Zeile


if ((neu = fopen(pnam, "w")) == NULL) ...

auftritt, was mir allerdings unerklärlich ist, da hier nichtmal eine allokierung geschieht.




else if (ccnt > 1)
{
sprintf(cmd,"splitflv %s %d",video, ccnt);
for (i=0; i<ccnt; i++)
{
sprintf(pnam,"/tmp/SCFIFO%d\0",cnr[i]);
if ((neu = fopen(pnam, "w")) == NULL)
{
perror("fopen");
exit(1);
}
sndstr = malloc(407);
sprintf(sndstr,"%s&part%d\0",pipbuf2,i);
fputs(sndstr,neu);
set_state(getmaxstate());
free(sndstr);
free(pnam);
fclose(neu);
}
}


pnam initialisierung: char *pnam = malloc(100);

Fehlerbezeichnung:
*** glibc detected *** malloc(): memory corruption: 0x0804d8b0 ***

Wäre über Hilfe sehr erfreut :confused:

ContainerDriver
28-04-2008, 17:49
Hallo.

Warum allozierst du denn in jedem Schleifendurchlauf neuen Speicher für sndstr, die Größe ist doch konstant (d.h. es würde genügen, in jedem Schritt das Nullbyte an den Index 0 zu schreiben)? Außerdem gibst du den Speicherbereich von pnam frei und greifst im nächsten Schleifendurchlauf wieder drauf zu, das ist böse. Die Datei (auf die du zugreifst) ist übrigens auch im nächsten Durchlauf schon zu ;)

Also erstmal die Fehler ausbessern und dann nochmal probieren. Falls der Fehler schon beim 0. Durchlauf aufgetreten ist, dann ist vermutlich bereits vor dem Codeabschnitt etwas in der Speicherverwaltung durcheinander gekommen. Hier würde es sich anbieten, den Speicher mit gdb bzw. ddd oder valgrind zu beobachten.

Gruß, Florian