Array - Structs und Malloc
-
Ahoi Hoi Zusammen
Ich bin gerade am C lernen und arbeite unter Linux "Arch".
Gerade bin ich dabei den umgang mit Malloc zu lernen und wollte ein Programm schreiben, mit dem man Dynamisch zur laufzeit ein Array mit Structs erweitern kann. Genau genommen habe ich ein struct "human" mit den variablen "age, name, country" und man kann dann z.b. die 1 drücken und einen neuen "human struct" ins Array füllen und wen man fertig ist drückt man die 2 und es werden alle structs im array in eine Datei "txt" geschrieben.Leider kann ich nicht genau sagen wo der fehler liegt, wie gesagt, ich bin es am Lernen, bin aber kein Student, also Ihr macht mir keine Hausaufgaben, es ist nur ein Hobby von mir.
Deshalb verlinke ich hier von pastebin aus den ganzen Quelltext, ein fehler taucht erst auf wen ich die 2 drücke um alles in eine datei zu schreiben, aber ich poste trotzdem alles, es könnte auch evtl. total verquer sein.
Freundlichst grüsse ich Euch und hoffe, jemand kann mir meine fehler aufzeigen, wenn es aber total "fail" ist, bitte ich um ein bisschen nachsicht hehe
Edit: vergessen zu erwähnen, der fehler ist: Speicherzugriffsfehler (Speicherabzug geschrieben)
-
Wie viel Speicher forderst du in Zeile 17 an?
-
Ohne den Quelltext näher anzusehen, meldet mir mein Compiler schon eine ganze Reihe Fehler:
test.c: In function ‘save_lib_data’: test.c:34:3: warning: statement with no effect [-Wunused-value] for(index; index>=0; index--){ ^ test.c:34:3: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits] for(index; index>=0; index--){ ^ test.c: In function ‘main’: test.c:56:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat] scanf("%d", &auswahl); ^ test.c:45:14: warning: unused parameter ‘argc’ [-Wunused-parameter] int main(int argc, char *args[]){ ^ test.c:60:16: warning: ‘lib’ may be used uninitialized in this function [-Wuninitialized] new_human(lib); ^
Allgemein: Globale Indizes für Schleifen?
Mach das mal schleunigst weg! Dann behebst du noch die anderen Fehler und dann besteht wenigstens die Chance, dass es laufen könnte.P.S.: Ja, da sehe ich noch eine ganze Reihe weiterer möglicher Fehler drin, aber beheb erst einmal alle genannten. Dann kann man weiter gucken.
-
hmm mag sich jetzt doof anhören, aber soviel wie halt ein (struct human) gross ist.
Oder soll ich schnell was reinschreiben und ausführen um die ganz genaue grösse sagen zu können ?
-
1. du bekommst aus deiner Funktion new_human nicht den Zeiger auf die neue struct zurück.
So wie du es machst, könntest du den SPeicher verändern, auf den lib zeigt.
Du willst aber lib selber verändern. Dazu wäre ein Doppelzeiger nötig.2. reservierst du immer nur Speicher für einen human. der Verweis auf den alten geht verloren.
Wenn du einen human hast und noch einen dazu packen willst, brauchst du Platz für zwei.
Schau dir mal realloc an.3. Keine globalen Variablen.
Beispiel
struct human *new_human(struct human *lib, unsigned int index){ .... Dein Code mit realloc return lib; } // aufruf mit lib = new_human(index);
Den Code hättest du hier noch posten können.
-
hmm ok, werd mich auch mal in realloc einlesen, fehler korrigieren und mich dann nochmal melden
man man man, wen man python auf C kommt, wird man fast überfahren, aber man lernt so viel was im hintergrund pasiert.
so kaffe holen, lesen und dann nochmals schreiben schreiben schreiben.
-
Bei etwas näherer Betrachtung sehe ich, dass da doch einige dicke Hauer drin sind: Was passiert mit dem Zeiger aus Zeile 17, wenn die Funktion zu Ende ist? Was genau macht index? fseek auf stdin? Glaubst du wirklich, dass du dein Code irgendwie "mehrere" Einträge verwaltet? Wo sollte das geschehen? Ich fürchte, man kann hier so ziemlich alles wegwerfen. Du solltest dir noch einmal in Ruhe die Grundlagen von Funktionen und Kontrollstrukturen ansehen. Dann die Grundlagen von Zeigern und Feldern. Dann die Grundlagen von dynamischer Speicherverwaltung. Bei dir fehlen wichtige Kenntnisse auf niedrigem Niveau, dynamische Speicherverwaltung ist da viel zu kompliziert. Ich vermute, du bekommst gerade das erste Mal so ein hartes Feedback, das liegt da dran, dass deine Programme bisher so halbwegs funktioniert haben. Das heißt aber nicht, dass sie richtig waren, du hast die Fehler bloß nicht bemerkt. Nun geht das aber nicht mehr gut. Du musst die Grundlagen wirklich beherrschen. Du musst jetzt gegensteuern und diese nochmal nachholen.
-
Hartes Feedback ist gut, ich will ja lernen
Es mag hart sein, aber das ist ok, lieber so, als es halbpatzig zum laufen zu bekommen und dannach denken, das ist ja top