*Markus: (C) Hilfe bei verketteter Liste

Hallo,

irgendwie scheint meine einfach verkettete Liste nicht richtig zu funktionieren. Ich verliere immer alle Elemente bis auf das neu Eingefügte und kann mir nicht erklären warum. was habe ich falsch gemacht?

  
typedef struct Person   {  
  char vorname[30];  
  char nachname[30];  
  struct Person *next;  
} Person;  
  
Person *kopf;  
Person *aktuellePerson;  
.  
.  
.  
  
void nameHinzufuegen()    {  
  
    Person *neuePerson;  
     char vn[30];  
   char nn[30];  
  
   printf("Vorname: ");  
     scanf("%s", vn);  
     printf("Nachname: ");  
     scanf("%s", nn);  
     strcpy(neuePerson->vorname, vn);  
     strcpy(neuePerson->nachname, nn);  
  
     if (kopf == NULL)    {  
        kopf = neuePerson;  
        neuePerson->next = NULL;  
     }  
     else  {  
         aktuellePerson = kopf;  
  
         while (aktuellePerson->next != NULL)   {  
              aktuellePerson = aktuellePerson->next;  
         }  
         aktuellePerson->next = neuePerson;  
         neuePerson->next = NULL;  
     }  
  
}  

Markus.

--
http://www.apostrophitis.at
六 7東曲 人港ラ
  1. Hallo Marcus,

    irgendwie scheint meine einfach verkettete Liste nicht richtig zu funktionieren. Ich verliere immer alle Elemente bis auf das neu Eingefügte und kann mir nicht erklären warum. was habe ich falsch gemacht?

    du hast dich mit der Speicherverwaltung ins Knie geschossen.

    void nameHinzufuegen()    {

    Person *neuePerson;

    So, damit existiert erstmal nur ein Zeiger auf eine Person-Struktur. Er zeigt irgendwo ins Nirwana, jedoch nicht auf einen erlaubten Speicherbereich (das wäre höchstens Zufall).
    Ich vermisse so etwas etwas wie neuePerson=malloc(sizeof(Person)).

    strcpy(neuePerson->vorname, vn);
         strcpy(neuePerson->nachname, nn);

    Hier wird's schon gefährlich: Du schreibst in den Speicherbereich, auf den der nicht initialisierte Zeiger verweist.

    aktuellePerson->next = neuePerson;

    So, jetzt zeigt aktuellePerson->next ebenfalls auf den zufälligen Speicherbereich.

    neuePerson->next = NULL;

    Alles in allem: Dynamische Datenstrukturen sind 'ne feine Sache. Aber dann muss man bitte auch dafür sorgen, dass man für jedes Element den nötigen Speicher reserviert (in C mit der Standardfunktion malloc(), in C++ alternativ auch mit dem Operator new).

    So long,
     Martin

    --
    Paradox ist, wenn der Innenminister sich äußert und der Außenminister sich erinnert.
    1. Hallo,

      Ich vermisse so etwas etwas wie neuePerson=malloc(sizeof(Person)).

      Das funktionierte bei mir seit gestern nicht, da ich zuerst nicht wusste warum, aber jetzt weiß ich's endlich:
      stdlib.h war nicht eingebunden und ich schrieb die ganze Zeit sizeOf anstatt sizeof, da ich es von Java gewohnt war. Irgendwie versuchte ich es deswegen drumherum zu wurschteln, was ja offensichtlich nicht klappte.
      Jetzt funktioniert es endlich.

      Markus.

      --
      http://www.apostrophitis.at
      六 7東曲 人港ラ
    2. Tach.

      du hast dich mit der Speicherverwaltung ins Knie geschossen.

      Und wird es vermutlich noch mehr. Da du ihm sein eigentliches Problem bereits erklärt hast, möchte ich noch Folgendes ergänzen:

      Konstrukte wie ...

        
      char vn[30];  
      printf("Vorname: ");  
      scanf("%s", vn);  
      strcpy(neuePerson->vorname, vn);  
      
      

      ... sind wunderbare Beispiele für zukünftigen Ärger mit Buffer Overflows. Markus, du kopierst hier einen String unbekannter Länge in einen Bereich, dem du vorher eine feste Größe zugewiesen hast. Benutze an dieser Stelle lieber strncpy(), um auch nur so viel zu kopieren, wie das Ziel fassen darf.

      --
      Once is a mistake, twice is jazz.
      1. Hallo,

        ... sind wunderbare Beispiele für zukünftigen Ärger mit Buffer Overflows. Markus, du kopierst hier einen String unbekannter Länge in einen Bereich, dem du vorher eine feste Größe zugewiesen hast. Benutze an dieser Stelle lieber strncpy(), um auch nur so viel zu kopieren, wie das Ziel fassen darf.

        Ich weiß, ich weiß, mir geht es aber nur um das Auffrischen meiner C-Grundkenntnisse. So eine Buffer-Overflow-Schleuder würde ich sowieso nicht veröffentlichen. Eigentlich müsste man ja auch sscanf anstatt scanf verwenden usw. Die Dinge sind mir klar. Trotzdem danke für den Hinweis.

        Markus.

        --
        http://www.apostrophitis.at
        六 7東曲 人港ラ