linked list
-
Ich will ueber das Terminal mehrere IP addressen als strings einlesen und die dann in einer Liste speichern doch irgendwie werden die Listenelemente untereinander immer wieder ueberschrieben (vlt. ein Pointer falsch gesetzt) nur komm ich einfach nicht drauf was genau schief laeuft...
struct targets { char *targ; struct targets *next; }; void readIP() { firstIP = malloc(sizeof(struct targets)); firstIP->targ = malloc(sizeof(char) * 20); struct targets *last = firstIP; int check; char *buf = malloc(sizeof(char) * 16); *buf = ""; while ((check = strncmp(buf, "done", 4)) != 0) { fgets(buf, 15, stdin); if (strcmp(buf, "\n") == 0) continue; strcpy(last->targ, buf); last->next = malloc(sizeof(struct targets)); last->next->targ = malloc(sizeof(char) * 20); last = last->next; } free(buf); }
-
Was soll das denn?
*buf = "";
Da meckert doch der Compiler!
Und deine Liste musst du noch mit NULL abschließen.
-
Ok hab die eine Zeile entfernt und den Struct next pointer jeweils auf NULL gesetzt.
Hab es auch mit dem Debuger in Eclipse versucht und konnte die Zeile welche jeweils das erste strukt element ueberschreibt lokalisieren aber ich weis immer noch nicht worans liegt??struct targets { char *targ; struct targets *next; }; void readIP() { firstIP = malloc(sizeof(struct targets)); firstIP->targ = malloc(sizeof(char) * 20); firstIP->next = NULL; struct targets *last = firstIP; int check; char *buf = malloc(sizeof(char) * 16); while ((check = strncmp(buf, "done", 4)) != 0) { fgets(buf, 15, stdin); if (strcmp(buf, "\n") == 0) continue; strcpy(last->targ, buf); last->next = malloc(sizeof(struct targets)); last->next->targ = malloc(sizeof(char) * 20); last->next->next = NULL; last = last->next; //Beim ausfuehren dieser Zeile wird jeweils das erste Element ueberschrieben??? } free(buf); }
-
Typ222 schrieb:
last = last->next; //Beim ausfuehren dieser Zeile wird jeweils das }
Was passiert dann? Sind die Daten weg?
last zeigt dann auf das neue Element. Und das hat noch keine Daten.Was steht bei
firstIP->targ
Wie kommst du außerhalb von readIP() an deine Liste ran?
-
Daten sind weg, im Prinzip gibs immer nur ein listenelement!?!?!?
firstIP->targ
wird zunaechst korrekt mit dem richtigen element beschrieben aber dann bei der zuweisung
last = last->next;
ueberschrieben??
firstIP ist eine globale Variable somit ist der Zugriff darauf kein Problem...
-
Bau mal sowas in deine while-Schleife:
int i=0; ... while ((check = strncmp(buf, "done", 4)) != 0) { .... last->next->targ = malloc(sizeof(char) * 20); sprintf(last->next->targ, "Lauf %d", i++); // einfuegen last->next->next = NULL; ....
und schau was passiert.
-
- du hast verkettete Listen nicht verstanden
- verkettete Listen sind nichts für Anfänger
- du verwendest ohne Grund C99 (dein Anwendungsfall funktioniert auch mit dem portableren C89)
- du sicherst Nutzereingaben >14 Zeichen nicht ab (das Programm hat dann "durchschlagenden" Erfolg)
- sizeof(char) ist immer 1
- check ist überflüssig
- ...
-
Hab den Code ein bisschen veraendert und die eine Zeile eingefuegt aber in das Feld
last->next->targ
wo ja eigentlich "Lauf i" geschrieben werden sollte wird nix hineingeschrieben!?
struct targets { char *targ; struct targets *next; }; void readIP() { firstIP = malloc(sizeof(struct targets)); firstIP->targ = malloc(sizeof(char) * 20); struct targets *last = firstIP; int i=0; char *buf = malloc(sizeof(char) * 1024); while (strncmp(buf, "done", 4) != 0) { fgets(buf, 1024, stdin); if (strcmp(buf, "\n") == 0) continue; strncpy(last->targ, buf, 15); last->next = malloc(sizeof(struct targets)); last->next->targ = malloc(sizeof(char) * 20); last->next->next = NULL; snprintf(last->next->targ, "Lauf %d", i++); last = last->next; } free(buf); }
-
Fehlt bei snprintf nicht noch ein Parameter?
-
sry ja der hat gefehlt jetzt hats geklapt mit der funktion aber die liste funkt immer noch nicht hier die Schritte wies bei mir ablaeuft:
-Speicher fuer erstes Element wird angelegt
-Lese erste Zeile
-Zeile wird in last->targ geschrieben
-Speicher fuer last-next und last->next->targ wird angelegt
-In last->next->targ wird "Lauf 0" geschrieben
-Nach ausfuehren von last->next->next = NULL, last->next->next zeigt auf 0x0
Momentane Speicherbelegung:name type value last struct targets* 0x6047a0 targ char* 0x6047c0 "12\n" next struct targets* 0x604420 targ char* 0x604440 "Lauf 0" next struct targets* 0x0
Nach ausfuehren des Befehls last = last->next;
siehts ploetzlich so aus:name type value last struct targets* 0x604420 targ char* 0x604440 "Lauf 0" next struct targets* 0x0 targ char* next struct targets*
-
Typ222 schrieb:
Nach ausfuehren des Befehls last = last->next;
siehts ploetzlich so aus:Das ist doch genau das, was du mit diesem Befehl sagst.
Der Zeiger
last
zeigt jetzt auf den nächsten Eintrag. Und das zeigt dir der Debugger auch an.
-
Jetzt hats geklappt
Danke fuer eure Hilfe!