Moin Moin!
void setMetaDataBezeichnung(struct metadata **m, const char *s);
void setMetaDataZusatzInfo(struct metadata **m, const char *s);
Entweder deutsch oder englisch, aber nicht so durcheinander. Warum struct metadata **m? Im Code wäre ein struct metadata *m wesentlich einfacher, denn Du änderst m ja nicht.
char* getMetaDataBezeichnung();
char* getMetaDataZusatzInfo();
Diese beiden Prototypen passen nicht zur Funktion weiter unten.
Ich kompiliere mit ...
$ gcc Metadata.c Main.c -o Main -std=c99
-Wall -pedantic sind oft hilfreich.
markus@archy ~/C-Programme/Projekte/Dateibrowser $ ./Main
Main: malloc.c:3074: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
AbgebrochenWas hat das zu bedeuten?
Ein Paranoia-Test in malloc ist fehlgeschlagen. Du ruft offenbar malloc() mit Parametern auf, die dem malloc()-Code nicht gefallen.
Ironischerweise funktioniert das Ganze aber, wenn ich die Funktion setMetaDataZusatzInfo kommentiere und somit nicht benutze. Wird also nur die erste Funktion aufgerufen funktioniert das Programm und ich bekomme die Ausgabe "Das ist die erste Bezeichnung". Kann sich das jemand erklären?
Verbogene Zeiger, Syntaxfehler, ...
Fang mit -Wall -pedantic an.
Meine zweite Frage betrifft die Pointerzuweisung. In metadata.h schreibe ich typedef struct metadata *MetaData; Ich kann nicht typedef struct metadata MetaData; schreiben, damit dieses teils objektorientierte Paradigma funktioniert (eigentlich wollte ich versuchen, die Struktur auf dem Stack zu erzeugen, aber das scheint irgendwie nicht zu funktionieren, da ja dann die Größe der Struktur nicht bekannt ist).
Doch, Du definierst die struct metadata nur an der falschen Stelle, im C-Code statt im Header.
Eine letzte Frage hätte ich noch zum Freigeben des Speichers. In Main führe ich ein free(m1) aus, was aber nicht ganz sauber wäre. Ich müsste die einzelnen Variablen der Struktur einzeln für sich auch freigeben, da ein killen der Struktur ja nicht heißt, dass auch die Variablen freigegeben wurden
Richtig. Wenn Du Dich nicht wie ein Assembler-Programmierer mit der Speicherverwaltung rumschlagen willst, nimm Ruby, Perl oder ähnliches. Ansonsten initialisiere deine frische struct metadata so, dass alle später allozierten Pointer erst einmal auf NULL gesetzt sind. Schreibe eine freeMetadata()-Methode, die alle Zeiger-Elemente der Struktur, die nicht NULL sind, wieder freigibt.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".