Segmentation Fault
-
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 20 struct element { struct element *next; char *zeichenkette; }; 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 " "fuer anfang\n"); return; } strcpy(anfang->zeichenkette, 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 fuer das " "letzte Element\n"); return; } zeiger=zeiger->next; strcpy(zeiger->zeichenkette,n); zeiger->next=NULL; } } void eingabe(void) { char nam[MAX]; printf("Zeichen........................: "); fgets(nam, MAX, stdin); getchar(); anhaengen(nam); } int main(void) { while(1) eingabe(); return EXIT_SUCCESS; }
Also jedesmal wenn ich nen Namen eingebe und dann enter drücke kommt es zu einem segmentation fault und ich weiß nicht wo der fehler liegt also ich denke mal irgendwo bei malloc. kann mir jemand helfen?
-
taipier@taipier:~/Desktop$ gcc -ggdb bla.c taipier@taipier:~/Desktop$ gdb a.out GNU gdb (GDB) 7.0-ubuntu Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/taipier/Desktop/a.out...done. (gdb) run Starting program: /home/taipier/Desktop/a.out Zeichen........................: abcde Program received signal SIGSEGV, Segmentation fault. 0x00ddca34 in strcpy () from /lib/tls/i686/cmov/libc.so.6
Das nächste mal bitte einen Debugger benutzen. Unter windows gibt es auch einige. Durch ein printf habe ich dann auch schnell herausgefunden, dass der obere nicht geht. Da ich mich mit verketteten listen nicht so ganz gut befasst habe, darfst du die Lösung des Problems selbst bestimmen.
-
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 fallklar, 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/