Segmentation fault -- warum?

Dieses Thema im Forum "C/C++" wurde erstellt von Blender3D, 05.06.2009.

  1. #1 Blender3D, 05.06.2009
    Zuletzt bearbeitet: 05.06.2009
    Blender3D

    Blender3D Vitamin C++

    Dabei seit:
    17.09.2007
    Beiträge:
    228
    Zustimmungen:
    0
    Ort:
    /root
    Hallo, liebe Forengemeinde.

    Ich habe mal versuch mit meinen spärlichen Programmierünsten in C++ ein programm zu schreiben, welches den sogenannten Caesarcode entschlüsselt. Das funktioniert auch ganz gut, nur gibt es einen Segmentation fault, wenn das programm eine eigendlich harmlose Zeile ausführt. Und ich weiss nicht, was ich falsch gemacht habe.

    Code:
    #include <stdio.h>
    
    
    char alphabet[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    
    char* umwandeln(char* text, int num)
    {
    
    	char* out_text;
    	int m;
    
    	for(int n = 0; text[n] != '\0'; n++)
    	{
    		switch(text[n])
    		{
    			case 'a':
    				m = 0;
    				break;
    			case 'b':
    				m = 1;
    				break;
    			case 'c':
    				m = 2;
    				break;
    			case 'd':
    				m = 3;
    				break;
    			case 'e':
    				m = 4;
    				break;
    			case 'f':
    				m = 5;
    				break;
    			case 'g':
    				m = 6;
    				break;
    			case 'h':
    				m = 7;
    				break;
    			case 'i':
    				m = 8;
    				break;
    			case 'j':
    				m = 9;
    				break;
    			case 'k':
    				m = 10;
    				break;
    			case 'l':
    				m = 11;
    				break;
    			case 'm':
    				m = 12;
    				break;
    			case 'n':
    				m = 13;
    				break;
    			case 'o':
    				m = 14;
    				break;
    			case 'p':
    				m = 15;
    				break;
    			case 'q':
    				m = 16;
    				break;
    			case 'r':
    				m = 17;
    				break;
    			case 's':
    				m = 18;
    				break;
    			case 't':
    				m = 19;
    				break;
    			case 'u':
    				m = 20;
    				break;
    			case 'v':
    				m = 21;
    				break;
    			case 'w':
    				m = 22;
    				break;
    			case 'x':
    				m = 23;
    				break;
    			case 'y':
    				m = 24;
    				break;
    			case 'z':
    				m = 25;
    				break;
    		}
    
    		out_text[n] = alphabet[m + num];
    	}
    	return out_text;
    }
    
    int main(void)
    {
    	char* eingabe;
    	int diff;
    
    	printf("\n");
    	printf("\tWillkommen beim Caesarcode-Entschluesselungsprogramm!\n");
    	printf("Geben sie zuerst die Zahl ein, die sie zur Entschluesselung verwenden wollen.\n");
    	printf(">> ");
    
    	scanf("%d", &diff);
    
    	printf("\n");
    	printf("Geben sie nun den Caesarcode, den sie entschlüssenl wollen ein und sie werden die wahre Nachricht erhalten.\n");
    	printf(">> ");
    
    	scanf("%s", &eingabe);
    
    	printf("\n\n\n");
    	printf("Berechne...");
    	printf("\n\n\n");
    
    //	printf("Ergebnis: %s", umwandeln(eingabe, diff));
    	umwandeln(eingabe, diff);
    
    	printf("\n");
    
    	return 0;
    }
    
    
    ich hoffe, ihr könnt mir weiterhelfen.

    Grüße, Blender3D

    Edit: die Zeile, die den Segmentation fault verursacht ist die mit der for-Schleife. Ich benutze GCC
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 05.06.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    beim kurzen Ueberfliegen fallen mir dazu eine Reihe von Sachen ein. Du schreibst zum Beispiel es waere C++, dabei ist es, soweit ich das sehen kann, reiner C Code. Bitte auseinanderhalten.

    Der genaue Fehlertext waere Wuenschenswert, und auch wie du darauf kommst dass der Fehler in der angegebenen Zeile ist.

    Ich denke eher dass das Problem hier liegt:
    Code:
    out_text[n] = alphabet[m + num];
    
    Da sehe ich sogar zwei Fehler. Erstens hast du nirgendwo Speicher fuer out_text alloziert, d.h. du versuchst auf Speicher zu schreiben der nicht dafuer vorgesehen war. Entweder musst du aus out_text einen char Array machen, oder mit malloc Speicher allozieren (und spaeter wieder freigeben).

    Zweitens ueberpruefst du nicht, ob "m + num" groesser 25 ist, was, wenn das der Fall ist, auch zu einem Segmentation Fault fuehrt.

    mfg
    bytepool
     
  4. #3 Blender3D, 05.06.2009
    Blender3D

    Blender3D Vitamin C++

    Dabei seit:
    17.09.2007
    Beiträge:
    228
    Zustimmungen:
    0
    Ort:
    /root
    Fehlercode:
    Code:
    moroe@Linux:~/Desktop$ gcc caesar.c
    moroe@Linux:~/Desktop$ ./a.out
    
            Willkommen beim Caesarcode-Entschluesselungsprogramm!
    Geben sie zuerst die Zahl ein, die sie zur Entschluesselung verwenden wollen.
    >> 3
    
    Geben sie nun den Caesarcode, den sie entschlüssenl wollen ein und sie werden die wahre Nachricht erhalten.
    >> abc
    
    
    
    Berechne...
    
    
    Segmentation fault
    moroe@Linux:~/Desktop$
    
    Das mit dem out_text habe ich auch gedacht, aber erst als ich die for schleife auskommentiert habe hat sich der Segmentation fault nicht wiederholt und als ich die Zeilemit der zuweising von out_text auskommentiert habe blieb der Fehler.

    Was meinst du soll ich machen, um out_text zu allozieren? Einfach ein Array mit einer festen Größe machen?

    Grüße, Blender3D
     
  5. #4 bytepool, 05.06.2009
    Zuletzt bearbeitet: 05.06.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,
    ja, die Art wie du die Scheilfe implementiert hast, sieht schon sehr komisch aus, aber ich hab auch noch nie reines C programmiert, da gibt es ja manchmal so komische Konstrukte. Dann wuerde ich mir mal die "n"s ausgeben lassen, damit du weisst bei welcher Iteration es falsch laeuft. Alternativ das Programm einfach Stueck fuer Stueck mit gdb abarbeiten, ist ja klein genug. Was ich mir eventuell noch vorstellen koennte, ist dass scanf den String nicht null-terminiert, aber das weiss ich nicht.

    Persoenlich mache ich den Abbruchstest von For Schleifen sowieso immer numerisch. D.h. erst die Stringlaenge vor der Schleife abfragen, und darauf dann testen.

    Jo.

    Edit:
    Ehm, ich sehe grad noch was, auch in der main funktion hast du eingabe nicht alloziert. Ich denke nicht dass scanf das fuer dich macht. Daher der erste Segmentation Fault bei der For Schleife, schon der erste Test schlaegt fehl. Nur komisch dass sich scanf nicht direkt beschwert.

    Edit2:
    Ach, du gibst die Adresse von dem Pointer an scanf, auch nicht schlecht. Damit hast du auf einem 32-bit System 4 byte um deinen String zu speichern, nur der Pointer zeigt dann natuerlich auf nichts. ;)
    Wenn du deine Eingabe laenger als 3 Zeichen machst, bekommst du also eventuell auch schon bei scanf einen Segmentation Fault. ;)

    Edit3:
    Naja, ich fahre jetzt jedenfalls ein paar Bierchen trinken, viel Erfolg noch. Generell musst du daran denken, dass die Pointerdeklaration alleine noch keinen Speicher reserviert, nur die 4 (bzw. 8 ) byte fuer den Pointer selber werden reserviert.

    mfg,
    bytepool
     
  6. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Eine gute Vorgehensweise ist es, das Programm mit einem Debugger laufen zu lassen, um genau die Zeile zu erkennen, an der die Speicherschutzverletzung stattfindet. Dazu solltest Du das Programm mit gcc mit den Optionen "-g -O0" kompilieren und dann mit
    "gdb ./a.out" ausfuehren. Am gdb-prompt 'run' eingeben, und das Programm wird ausgefuehrt. Wenn es zu der Speicherschutzverletzung kommt, tippst Du 'back' ein, um die Zeilen zu erfahren, an denen es zum Fehler kam.

    Kopilierst Du mit '-Wall'? Tauchen dabei Warnhinweise auf?
     
  7. #6 Blender3D, 06.06.2009
    Blender3D

    Blender3D Vitamin C++

    Dabei seit:
    17.09.2007
    Beiträge:
    228
    Zustimmungen:
    0
    Ort:
    /root
    Hallo.

    Danke für euren schnellen Support. Der Segmetation fault lag daran, dass die eingabe nicht alloziert war.

    Vielen Dank!!!

    Grüße, Blender3D
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Segmentation fault -- warum?

Die Seite wird geladen...

Segmentation fault -- warum? - Ähnliche Themen

  1. pacman verabschiedet sich mit 'segmentation fault'

    pacman verabschiedet sich mit 'segmentation fault': Tag auch. Ich suche jetzt seit 2 Tagen nach einer Lösung für mein Problem und dachte ein paar mal, sie gefunden zu haben - letztendlich steh ich...
  2. Segmentation Fault bei strcat?

    Segmentation Fault bei strcat?: Heyho, Ich habe folgendes Progrämmchen versucht, zu schreiben. (Was es machen soll, steht weiter unten ;) ). /* * filewatch.c * * Created on:...
  3. Segmentation Fault unter Firefox und Seamonkey

    Segmentation Fault unter Firefox und Seamonkey: Sobald ich yahoo.de öffnen möchte kracht mein Seamonkey und Firefox. Terminal Ausgabe: ---------- s.wiederspahn@ws5-43-fra:~> seamonkey...
  4. Segmentation fault at /usr/share/YaST2/clients/sw_single.ycp:162 Segmentation f

    Segmentation fault at /usr/share/YaST2/clients/sw_single.ycp:162 Segmentation f: Moin Moin, ich hab hier auf SLES 9 ein Problem mit yast. Starte ich ihn aus der Konsole (kein X vorhanden, und das soll / muss auch so bleiben)...
  5. preg_match() liefert httpd_error: child pid 4736 exit signal Segmentation fault (11)

    preg_match() liefert httpd_error: child pid 4736 exit signal Segmentation fault (11): Hallo, ich habe einen kleinen Parser in PHP5.2.1 unter Apache 2.2.4 geschrieben, der folgendes Muster in einer LaTeX Datei sucht: $line =...