Segmentation fault -- warum?

Blender3D

Blender3D

Vitamin C++
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
 
Zuletzt bearbeitet:
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.

Edit: die Zeile, die den Segmentation fault verursacht ist die mit der for-Schleife. Ich benutze GCC
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
 
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
 
Hi,
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.
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.

Was meinst du soll ich machen, um out_text zu allozieren? Einfach ein Array mit einer festen Größe machen?
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
 
Zuletzt bearbeitet:
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?
 
Hallo.

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

Vielen Dank!!!

Grüße, Blender3D
 

Ähnliche Themen

Aufgabe in C

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Problem mit Texteingabe

Last mit etc/passwd anzeigen lassen

Zurück
Oben