*Markus: (C) seltsamer calloc-Fehler + Pointerfragen

Beitrag lesen

Jetzt habe ich das nächste Problem. Füge ich folgende Funktion hinzu:

  
void destroyMetaData(struct metadata *m)   {  
	if (m->bezeichnung != NULL)  
		free(m->bezeichnung);  
	if (m->zusatzinfo != NULL)  
		free(m->zusatzinfo);  
		  
	free(m);  
}

und rufe die Funktion in Main so auf:

  
#include <stdio.h>  
#include <stdlib.h> 					//malloc  
#include "metadata.h"  
  
int main(void)   {  
  
    MetaData m1 = (MetaData)malloc(sizeof(MetaData));  
  
    setMetaDataBezeichnung(*&m1, "Das ist die erste Bezeichnung");  
    //setMetaDataZusatzInfo(*&m1, "Das ist eine zusätzliche Information");  
    printf("%s\n", getMetaDataBezeichnung(m1));  
    //printf("%s\n", getMetaDataZusatzInfo(m1));  
  
    destroyMetaData(m1);  
  
return 0;  
}  

...dann bekomme ich folgende Ausgabe:

markus@archy ~/C-Programme/Projekte/Dateibrowser $ ./Main
Das ist die erste Bezeichnung
*** glibc detected *** ./Main: free(): invalid next size (fast): 0x09e77018 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7f429b1]
/lib/libc.so.6[0xb7f440b2]
/lib/libc.so.6(cfree+0x6d)[0xb7f4717d]
./Main[0x8048679]
./Main[0x80486e9]
/lib/libc.so.6(__libc_start_main+0xe6)[0xb7eeda36]
./Main[0x8048481]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:15 2454474    /home/markus/C-Programme/Projekte/Dateibrowser/Main
08049000-0804a000 rwxp 00000000 08:15 2454474    /home/markus/C-Programme/Projekte/Dateibrowser/Main
09e77000-09e98000 rwxp 00000000 00:00 0          [heap]
b7d00000-b7d21000 rwxp 00000000 00:00 0
b7d21000-b7e00000 ---p 00000000 00:00 0
b7ed6000-b7ed7000 rwxp 00000000 00:00 0
b7ed7000-b8017000 r-xp 00000000 08:13 647193     /lib/libc-2.10.1.so
b8017000-b8019000 r-xp 00140000 08:13 647193     /lib/libc-2.10.1.so
b8019000-b801a000 rwxp 00142000 08:13 647193     /lib/libc-2.10.1.so
b801a000-b801e000 rwxp 00000000 00:00 0
b8022000-b803f000 r-xp 00000000 08:13 231795     /usr/lib/libgcc_s.so.1
b803f000-b8040000 rwxp 0001c000 08:13 231795     /usr/lib/libgcc_s.so.1
b8040000-b8041000 rwxp 00000000 00:00 0
b8041000-b8042000 r-xp 00000000 00:00 0          [vdso]
b8042000-b805e000 r-xp 00000000 08:13 647192     /lib/ld-2.10.1.so
b805e000-b805f000 r-xp 0001b000 08:13 647192     /lib/ld-2.10.1.so
b805f000-b8060000 rwxp 0001c000 08:13 647192     /lib/ld-2.10.1.so
bfc20000-bfc35000 rw-p 00000000 00:00 0          [stack]
Abgebrochen

Also ällmählich verstehe ich gar nichts mehr. Wieso funktioniert das Freigeben des Speichers nicht? Es liegt definitiv an diesen Aufrufen:

if (m->bezeichnung != NULL)  
	free(m->bezeichnung);  
if (m->zusatzinfo != NULL)  
	free(m->zusatzinfo);  

...nur free(m) funktioniert.

Markus.