On Thu, Feb 19, 2004 at 03:14:16PM +0100, Stefan Hundhammer wrote:
On Thursday 19 February 2004 14:16, Michael Unterkalmsteiner wrote:
ACK, da hab ich wohl geschlafen, trotzdem schmiert das Programm weiterhin ab und ich hab weiterhin Tomaten auf den Augen und find den Fehler nicht.
Das hängt aber wohl damit zusammen; ich weiß nicht genau, was dieses g_list_prepend() macht, aber ich denke mal, es allokiert wohl nicht selber nochmal Speicher für den Dateinamen - dafür mußt Du selber sorgen. Der Inhalt von "dir", also auch "dir->name", wird irgendwann ungültig - "dir" zeigt auf eine Struktur innerhalb von readdir(). Du merkst Dir also in dieser Liste -zig mal die gleiche Adresse, wo aber inzwischen schon gar nichts mehr oder irgendwas anderes steht.
-> Du mußt für den Namen selber Speicher allokieren, etwa so:
name = strdup( dir->d_name ); di->name = g_list_prepend (di->name, name);
Und freigeben wieder, wenn Du die gesamte Liste zerstörst - und erst dann.
Sowas ähnliches hatte ich vorher auch schon gemacht (daher auch der blöde Fehler mit g_free(name), nämlich: name = g_strconcat(name, NULL); ..Moment, ich probier grad nebenbei was aus, und ich glaub ich hab den Fehler gefunden. main() sieht nun folgendermaßen aus: .. path = g_strdup (g_get_current_dir ()); di->path = path; get_dirs_in_path (di); .. g_free (di->path); g_list_free (di->name); g_free (path); ..nochmal 4 Stunden später ... hab bemerkt, dass ich für 'di' keinen Speicher allociert habe *badamm*, also di = g_new0 (Dirinfo, 1); Jetz hab ich Kopfweh ;-), danke aber für die Hilfe, hast mich auf den richtigen Weg geführt Mfg, Michael -- Man hat festgestellt, dass zwei Drittel aller Lügen innerhalb der Familie passieren! Die häufigsten Lügen in der Familie sind 1. Ž Hmmm, lecker!Ž, 2. ŽIch Dich auch!Ž und 3. ŽDas? Da hat mich Ž ne Katze gekratzt!Ž -- Harald Schmidt