Seite 1 von 1

Segmentation Fault

Verfasst: Di Mär 02, 2021 1:32 pm
von DerProgger
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

Re: Segmentation Fault

Verfasst: Di Mär 02, 2021 1:54 pm
von nufan
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.

Re: Segmentation Fault

Verfasst: Di Mär 02, 2021 2:44 pm
von Xin
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. :-)

Re: Segmentation Fault

Verfasst: Di Mär 02, 2021 6:07 pm
von DerProgger
Hi Leute,
danke euch für die schnellen Antworten, euer Tipp hat geholfen! Mit dem & in den scanfs klappts! :)
Viele Grüße

Re: Segmentation Fault

Verfasst: Di Mär 02, 2021 7:09 pm
von Xin
Hast Du das free korrigiert?

Re: Segmentation Fault

Verfasst: Mo Mär 08, 2021 10:11 pm
von DerProgger
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

Re: Segmentation Fault

Verfasst: Mo Mär 08, 2021 10:29 pm
von Xin
Hast Du einen aktuellen Quellcode?

Re: Segmentation Fault

Verfasst: Di Mär 09, 2021 6:55 pm
von DerProgger
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;
		}
	}
	
}



Re: Segmentation Fault

Verfasst: Di Mär 09, 2021 9:00 pm
von Xin
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)