Segmentation Fault

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
DerProgger
Beiträge: 7
Registriert: Di Mär 02, 2021 1:21 pm

Segmentation Fault

Beitrag von DerProgger » Di Mär 02, 2021 1:32 pm

Hallo an alle!
Ich habe gerade ein Programm in C mit einer verketteten Liste geschrieben, bei dem man Kontakte in einer Kontaktliste speichern kann. Nachdem man seine Kontakte eingeben hat, kann man sich diese ausgeben lassen. Ich erhalte leider einen Segmentation Fault, kann meinen Fehler gerade aber nicht ausfindig machen. Der einzige Speicher, den ich benutze, reserviere ich mir ja über malloc(). Vielleicht kann mir da ja jemand von euch weiterhelfen! :)

Viele Grüße
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Segmentation Fault

Beitrag von nufan » Di Mär 02, 2021 1:54 pm

Hallo :)

Was mir auffällt ist folgende Eingabe:

Code: Alles auswählen

scanf(" %d ", kontakt->telefonnummer);
scanf() erwartet sich eine Adresse als Parameter:

Code: Alles auswählen

scanf(" %d ", &(kontakt->telefonnummer));
Sollte das allein das Problem nicht beheben, lade bitte deinen vollständigen Code als kompilierbaren Text hoch :)

Generell kann ich valgrind als Tool zum Finden von ungültigen Zugriffen empfehlen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Segmentation Fault

Beitrag von Xin » Di Mär 02, 2021 2:44 pm

Willkommen auf proggen.org, DerProgger :-D
DerProgger hat geschrieben:
Di Mär 02, 2021 1:32 pm
Ich erhalte leider einen Segmentation Fault, kann meinen Fehler gerade aber nicht ausfindig machen. Der einzige Speicher, den ich benutze, reserviere ich mir ja über malloc().
Naja, es kommt auch ein wenig drauf an, welche Eingaben Du machst. Ein sehr langer Vorname oder längerer Nachname und das Ding fliegt Dir um die Ohren.
DerProgger hat geschrieben:
Di Mär 02, 2021 1:32 pm
Vielleicht kann mir da ja jemand von euch weiterhelfen! :)
Ich denke schon.

Mit nufans Tipp, kommst Du weiter, aber nun gibst Du die Liste aus und beim letzten Eintrag explodiert das Programm, richtig?
Vielleicht solltest Du den letzten eingegebenen Kontakt nicht wieder freigeben und stattdessen am Ende alle. ;-)

Ansonsten lass die Leerzeichen aus den scanf-Geschichten raus, beachte, was nufan sagte und bitte kopiere in Zukunft Quelltexte als Text rein.

Besten Dank. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DerProgger
Beiträge: 7
Registriert: Di Mär 02, 2021 1:21 pm

Re: Segmentation Fault

Beitrag von DerProgger » Di Mär 02, 2021 6:07 pm

Hi Leute,
danke euch für die schnellen Antworten, euer Tipp hat geholfen! Mit dem & in den scanfs klappts! :)
Viele Grüße

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Segmentation Fault

Beitrag von Xin » Di Mär 02, 2021 7:09 pm

Hast Du das free korrigiert?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DerProgger
Beiträge: 7
Registriert: Di Mär 02, 2021 1:21 pm

Re: Segmentation Fault

Beitrag von DerProgger » Mo Mär 08, 2021 10:11 pm

Hi Xin,
sorry, dass ich deine Nachricht so spät gelesen habe.
Ne, das free() habe ich nicht korrigiert, da es tatsächlich auch so funktioniert hat. Wenn die Kontakte ausgegeben werden, ist das Programm ja zu Ende, dann müssten die eingespeicherten Kontakte sowieso wieder freigegeben werden?! Mir gings da bloß drum, den einen überschüssigen Kontakt, den man ja nicht mehr eingeben will, auch wieder freizugeben! ;)
Grüße

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Segmentation Fault

Beitrag von Xin » Mo Mär 08, 2021 10:29 pm

Hast Du einen aktuellen Quellcode?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DerProgger
Beiträge: 7
Registriert: Di Mär 02, 2021 1:21 pm

Re: Segmentation Fault

Beitrag von DerProgger » Di Mär 09, 2021 6:55 pm

Hier der Code:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>


struct Kontaktliste {
	char vorname[20], nachname[20];
	unsigned telefonnummer;
	struct Kontaktliste *next;
}*kontaktfirst, *kontaktlast;


int main() 
{
	printf("Zum Abbrechen der Eingabe eine 0 bei \"Telefonnummer\" eingeben! \n");
	struct Kontaktliste *kontakt;
	do{
	kontakt = (struct Kontaktliste*) malloc(sizeof(struct Kontaktliste));
	printf("Bitte geben Sie Vor- und Nachnamen ein: ");
	scanf(" %19s %19s", &(kontakt->vorname), &(kontakt->nachname));
	printf("Bitte geben Sie die Telefonnummer ein: ");
	scanf(" %d", &(kontakt->telefonnummer));
	printf("\n");
	if(kontaktfirst == NULL)
	{
		kontaktfirst = kontaktlast = kontakt;
		kontakt->next=NULL;
	}
	else
	{
		kontaktlast->next=kontakt;
		kontaktlast=kontakt;
		kontaktlast->next=NULL;
	}
	}while(kontakt->telefonnummer);
	free(kontakt);
	kontaktlast->next=NULL;
	char antwort;
	struct Kontaktliste *ausgabe;
	ausgabe=kontaktfirst;
	printf("Wollen Sie sich Ihre Kontakte ausgeben lassen? j fuer Ja/n fuer Nein");
	scanf(" %c", &antwort);
	printf("\n");
	if(antwort=='j')
	{
		while(ausgabe)
		{
			printf("%s %s: Tel.: %d\n", ausgabe->vorname, ausgabe->nachname, ausgabe->telefonnummer);
			ausgabe= ausgabe->next;
		}
	}
	
}



Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Segmentation Fault

Beitrag von Xin » Di Mär 09, 2021 9:00 pm

Da geht noch was. ;-)

Code: Alles auswählen

xin@dualpower:~/proggen$ valgrind ./a.out 
==8811== Memcheck, a memory error detector
==8811== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==8811== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==8811== Command: ./a.out
==8811== 
Zum Abbrechen der Eingabe eine 0 bei "Telefonnummer" eingeben! 
Bitte geben Sie Vor- und Nachnamen ein: Sash A
Bitte geben Sie die Telefonnummer ein: 7328

Bitte geben Sie Vor- und Nachnamen ein: Sash b
Bitte geben Sie die Telefonnummer ein: 4711

Bitte geben Sie Vor- und Nachnamen ein: No one
Bitte geben Sie die Telefonnummer ein: 0

==8811== Invalid write of size 8
==8811==    at 0x109324: main (Derprogger.c:36)
==8811==  Address 0x4a679f0 is 48 bytes inside a block of size 56 free'd
==8811==    at 0x483DA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x10931C: main (Derprogger.c:35)
==8811==  Block was alloc'd at
==8811==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x109239: main (Derprogger.c:17)
==8811== 
Wollen Sie sich Ihre Kontakte ausgeben lassen? j fuer Ja/n fuer Neinj

Sash A: Tel.: 7328
Sash b: Tel.: 4711
==8811== Invalid read of size 4
==8811==    at 0x109378: main (Derprogger.c:47)
==8811==  Address 0x4a679e8 is 40 bytes inside a block of size 56 free'd
==8811==    at 0x483DA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x10931C: main (Derprogger.c:35)
==8811==  Block was alloc'd at
==8811==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x109239: main (Derprogger.c:17)
==8811== 
==8811== Invalid read of size 1
==8811==    at 0x483FF46: strlen (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x48F0717: __vfprintf_internal (vfprintf-internal.c:1647)
==8811==    by 0x48D9E3E: printf (printf.c:33)
==8811==    by 0x10939F: main (Derprogger.c:47)
==8811==  Address 0x4a679c0 is 0 bytes inside a block of size 56 free'd
==8811==    at 0x483DA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x10931C: main (Derprogger.c:35)
==8811==  Block was alloc'd at
==8811==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x109239: main (Derprogger.c:17)
==8811== 
==8811== Invalid read of size 1
==8811==    at 0x483FF54: strlen (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x48F0717: __vfprintf_internal (vfprintf-internal.c:1647)
==8811==    by 0x48D9E3E: printf (printf.c:33)
==8811==    by 0x10939F: main (Derprogger.c:47)
==8811==  Address 0x4a679c1 is 1 bytes inside a block of size 56 free'd
==8811==    at 0x483DA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x10931C: main (Derprogger.c:35)
==8811==  Block was alloc'd at
==8811==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x109239: main (Derprogger.c:17)
==8811== 
==8811== Invalid read of size 1
==8811==    at 0x4905C5C: _IO_new_file_xsputn (fileops.c:1219)
==8811==    by 0x4905C5C: _IO_file_xsputn@@GLIBC_2.2.5 (fileops.c:1197)
==8811==    by 0x48F045C: outstring_func (vfprintf-internal.c:239)
==8811==    by 0x48F045C: __vfprintf_internal (vfprintf-internal.c:1647)
==8811==    by 0x48D9E3E: printf (printf.c:33)
==8811==    by 0x10939F: main (Derprogger.c:47)
==8811==  Address 0x4a679c1 is 1 bytes inside a block of size 56 free'd
==8811==    at 0x483DA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x10931C: main (Derprogger.c:35)
==8811==  Block was alloc'd at
==8811==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x109239: main (Derprogger.c:17)
==8811== 
==8811== Invalid read of size 1
==8811==    at 0x48447B0: mempcpy (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x4905B81: _IO_new_file_xsputn (fileops.c:1236)
==8811==    by 0x4905B81: _IO_file_xsputn@@GLIBC_2.2.5 (fileops.c:1197)
==8811==    by 0x48F045C: outstring_func (vfprintf-internal.c:239)
==8811==    by 0x48F045C: __vfprintf_internal (vfprintf-internal.c:1647)
==8811==    by 0x48D9E3E: printf (printf.c:33)
==8811==    by 0x10939F: main (Derprogger.c:47)
==8811==  Address 0x4a679c0 is 0 bytes inside a block of size 56 free'd
==8811==    at 0x483DA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x10931C: main (Derprogger.c:35)
==8811==  Block was alloc'd at
==8811==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x109239: main (Derprogger.c:17)
==8811== 
==8811== Invalid read of size 1
==8811==    at 0x48447BE: mempcpy (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x4905B81: _IO_new_file_xsputn (fileops.c:1236)
==8811==    by 0x4905B81: _IO_file_xsputn@@GLIBC_2.2.5 (fileops.c:1197)
==8811==    by 0x48F045C: outstring_func (vfprintf-internal.c:239)
==8811==    by 0x48F045C: __vfprintf_internal (vfprintf-internal.c:1647)
==8811==    by 0x48D9E3E: printf (printf.c:33)
==8811==    by 0x10939F: main (Derprogger.c:47)
==8811==  Address 0x4a679d6 is 22 bytes inside a block of size 56 free'd
==8811==    at 0x483DA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x10931C: main (Derprogger.c:35)
==8811==  Block was alloc'd at
==8811==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x109239: main (Derprogger.c:17)
==8811== 
No one: Tel.: 0
==8811== Invalid read of size 8
==8811==    at 0x1093A4: main (Derprogger.c:48)
==8811==  Address 0x4a679f0 is 48 bytes inside a block of size 56 free'd
==8811==    at 0x483DA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x10931C: main (Derprogger.c:35)
==8811==  Block was alloc'd at
==8811==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==8811==    by 0x109239: main (Derprogger.c:17)
==8811== 
==8811== 
==8811== HEAP SUMMARY:
==8811==     in use at exit: 112 bytes in 2 blocks
==8811==   total heap usage: 5 allocs, 3 frees, 2,216 bytes allocated
==8811== 
==8811== LEAK SUMMARY:
==8811==    definitely lost: 0 bytes in 0 blocks
==8811==    indirectly lost: 0 bytes in 0 blocks
==8811==      possibly lost: 0 bytes in 0 blocks
==8811==    still reachable: 112 bytes in 2 blocks
==8811==         suppressed: 0 bytes in 0 blocks
==8811== Rerun with --leak-check=full to see details of leaked memory
==8811== 
==8811== For lists of detected and suppressed errors, rerun with: -s
==8811== ERROR SUMMARY: 20 errors from 8 contexts (suppressed: 0 from 0)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten