Segmentation Fault



  • Elec schrieb:

    if((anfang =
           malloc(sizeof(struct element))) == NULL) 
          {
             fprintf(stderr, "Kein Speicherplatz vorhanden "
                             "fuer anfang\n");
             return;
          }
          strcpy(anfang->zeichenkette, n);
    

    ^^ der pointer in 'anfang' zeigt ins nichts, machs etwa so:

    anfang = malloc(sizeof(struct element));
    if (anfang)
    {
       anfang->zeichenkette = malloc (strlen(n)+1);
       if (anfang->zeichenkette)
       {
          // <-- erst jetzt den string rüberkopieren
       }
    }
    

    🙂



  • Danke für die schnelle Hilfe

    ich hab das strcpy weg gemacht dann ging es jedoch wird mir jetzt wenn ich z.B. "asdf" eingebe als ausgabe gebracht "@"
    Dies ist bei jeder Eingabe die ich mache der fall 😞

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX 20
    
    struct element{
       char *name;
       char *zeichenkette;
       struct element *next;
    };
    
    struct element *next   = NULL;
    struct element *anfang = NULL;
    
    void anhaengen(char *n) {
       struct element *zeiger;
       if(anfang == NULL) {
          if((anfang =
           malloc(sizeof(struct element))) == NULL) {
             fprintf(stderr, "Kein Speicherplatz vorhanden "
                             "für anfang\n");
             return;
          }
          anfang->name = n;
          anfang->next=NULL;
       }
       else {
          zeiger=anfang;
          while(zeiger->next != NULL)
             zeiger=zeiger->next;
          if((zeiger->next =
           malloc(sizeof(struct element))) == NULL) {
              fprintf(stderr,"Kein Speicherplatz für das "
                             "letzte Element\n");
              return;
          }
          zeiger=zeiger->next; 
          zeiger->name = n;
          zeiger->next=NULL;
       }
    }
    
    void loesche(char *wen) {
       struct element *zeiger, *zeiger1;
       if(anfang != NULL) {
          if(strcmp(anfang->name,wen) == 0) {
             zeiger=anfang->next;
             free(anfang);
             anfang=zeiger;
          }
          else {
             zeiger=anfang;
             while(zeiger->next != NULL) {
                zeiger1=zeiger->next;
                if(strcmp(zeiger1->name,wen) == 0) {
                   zeiger->next=zeiger1->next;
                   free(zeiger1);
                   break;
                }
                zeiger=zeiger1;
             } 
          }   
       }      
       else
          printf("Es sind keine Daten zum Loeschen vorhanden!!!\n");
    }
    
    void ausgabe(void) {
       struct element *zeiger = anfang;
       printf("|%10cName"
       "\n",' ');
       printf("||====================="
       "||\n");
    
       while(zeiger != NULL) {
          printf("%12s\n",
             zeiger->name);
             printf("|-------------------"
                    "|\n");
             zeiger=zeiger->next;
       }
    }
    
    void eingabe(void) {
       char nam[MAX];
       char *ptr;
       printf("Zeichen: ");
       fgets(nam, MAX, stdin);
       ptr = strrchr(nam, '\n');
       *ptr = '\0';
       getchar();
       anhaengen(nam);
    
    }
    
    int main(void) {
       int wahl;
       char dname[MAX];
    
       do {
          printf("\n1 : Eingabe\n");
          printf("2 : Ausgabe\n");
          printf("3 : Zeichen loeschen\n");
          printf("9 : Ende\n");
          printf("Ihre Wahl : ");
          scanf("%d",&wahl);
          getchar();
          switch(wahl) {
             case 1 : eingabe();
                      break;
             case 2 : ausgabe();
                      break;
             case 3 : printf("Das zeichen zum Loeschen: ");
                      fgets(dname, MAX, stdin);
                      loesche(strtok(dname, "\n"));
                      break;
             case 9 : break;
             default: printf("Falsche Eingabe!!!\n");
          }
       } while(wahl != 9);
       return EXIT_SUCCESS;
    }
    


  • Elec schrieb:

    ich hab das strcpy weg gemacht dann ging es jedoch wird mir jetzt wenn ich z.B. "asdf" eingebe als ausgabe gebracht "@"
    Dies ist bei jeder Eingabe die ich mache der fall

    klar, weil du ja nur den pointer kopierst, aber nicht den inhalt. in dem fall ist es die adresse der lokalen variablen 'nam' aus 'eingabe', die nach dem verlassen der funktion nicht mehr gültig ist.
    🙂



  • also muss ich das doch wieder hinzufügen und dann so aufbauen wie du es beschrieben hast?



  • ^^oder du machst aus 'zeichenkette' in 'struct element' ein array und keinen pointer.
    🙂



  • mmh

    Also wenn ich das jetzt so einbinde wie du es beschrieben hast kommt segmentation fault wieder

    ich glaub der schnupfen liegt auf meinem gehorn so dass ich net richtig denken kann 🙂

    void anhaengen(char *n) {
       struct element *zeiger;
       if(anfang == NULL) {
          anfang = malloc(sizeof(struct element));
           if(anfang) {
             anfang->zeichenkette = malloc (strlen(n)+1);
    	  if(anfang->zeichenkette){
    	    strcpy(anfang->name, n);
    	  }
    	 fprintf(stderr, "Kein Speicherplatz vorhanden "
                             "für anfang\n");
             return;
          }
    
          anfang->next=NULL;
       }
       else {
          zeiger=anfang;
          while(zeiger->next != NULL)
             zeiger=zeiger->next;
          if((zeiger->next =
           malloc(sizeof(struct element))) == NULL) {
              fprintf(stderr,"Kein Speicherplatz für das "
                             "letzte Element\n");
              return;
          }
          zeiger=zeiger->next; 
          strcpy(zeiger->name, n);
          zeiger->next=NULL;
       }
    }
    


  • Elec schrieb:

    anfang = malloc(sizeof(struct element));
          if(anfang) 
          {
             anfang->zeichenkette = malloc (strlen(n)+1);
    	 if(anfang->zeichenkette)
             {
    	    strcpy(anfang->name, n);
    	 }
    ...
    

    ^^hier holst du speicher für 'zeichenkette', kopierst aber den string nach 'name'. du musst natürlich den string dorthin kopieren, wo du auch speicher reserviert hast.
    btw, und mach die öffnende geschweifte klammer immer in die nächste zeile, der code ist sonst ziemlich grausam anzusehen.
    🙂



  • Hey Leute ich bin es nochmal.

    Also mein Code sieht so aus.
    http://paste.pocoo.org/show/153839/
    Es funktioniert auch wunderbar.
    Meine Struktur soll aber laut Vorgabe ohne [MAX] sein.

    Da hab ich mir gedacht setze vor die Struktur :

    char zeichenkette [MAX];
    

    Doch dann kommt immer Segmentation Fault

    Kann mir da jemand weiter helfen?

    Und ich hätte noch eine Frage, wie löse ich es das wenn einer mehr als 100000 Zeichen eingibt es Fehler erscheint der ihn zum erneuten eingeben auffordert?



  • So Leute ich bin jetzt weiter, also Segmentation Fault kommt nicht mehr, außer wenn ich mehr als 100000 Zeichen eingebe...also müsste irgend was noch machen die den Speicher dann erhöht. Hat jemand davon eine Ahnung?

    So mein Hauptproblem besteht jedoch darin das er die letzte Eingabe über die vorhergehenden kopiert, d.h. wenn ich 3 Eingaben gemacht habe dann habe ich net 3 verschiedene, sondern 3 gleiche.

    Hier mein Quellcode:
    http://paste.pocoo.org/show/154394/



  • So Leute. Hab jetzt alles gefixt bekommen.
    Es lag an der Eingabefunktion.

    Für die Leute die Interesse dran haben.
    Hier der Quellcode:
    http://paste.pocoo.org/show/154591/


Anmelden zum Antworten