Hallo,
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.
Wie gesagt funktioniert das ja auch, wenn ich *&m1 übergebe.
char* getMetaDataBezeichnung();
char* getMetaDataZusatzInfo();Diese beiden Prototypen passen nicht zur Funktion weiter unten.
Stimmt. Leider ist dies trotzdem nicht die Ursache für den Fehler.
Ich kompiliere mit ...
$ gcc Metadata.c Main.c -o Main -std=c99
-Wall -pedantic sind oft hilfreich.
-Wall zeigt keinen Unterschied. Weder beim Kompilieren, noch beim Ausführen. Der Fehler ist derselbe.
-pendantic, oder ähnliches kennt der Compiler nicht.
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.
Hmmm. Wie finde ich heraus, was malloc dabei nicht gefällt?
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, ...
Heißt das, dass es vorher immer nur zufälligerweise richtig funktioniert hat?
Fang mit -Wall -pedantic an.
Wie gesagt, keine Unterschiede, bzw. nicht vorhanden.
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.
Die Frage, wo denn nun was genau deklariert und/oder initialisiert werden sollte, stellte ich mir ohnehin anfangs.
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.
Ok, verstanden.
Markus