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.