Forum: PC-Programmierung Segmentation fault


von Bero408 (Gast)


Lesenswert?

Hey, beim folgenden Programm habe ich ein Problem. Die abfrage wie viele 
Studenten, wie der erste heißt und welche Nte der erste geschrieben hat, 
klappen, aber ab dort bricht das programm ab und es wird mir angezeigt:
"Segmentation fault(Speicherabzug geschrieben." Da mir googeln auch 
nicht wirklich weitergeholfen hat, wollte ich hier mal nachfragen, ob 
mir jemand eine Lösung vorschlagen kann und am besten noch den Fehler 
erklären kann...
Danke im Voraus.


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

struct Studenten
{
  char Name[15];
  float Note;
};

int Anzahl, N;
float bestenote = 6.0;
struct Studenten *Student;
struct bestenote *NOTE;

void Einlesen()
{

  Student = (struct Studenten *) malloc(sizeof(struct Studenten));

  printf("Wieviele Studierende sind es?\n");
  scanf("%d", &Anzahl);
  for(N=0; N<Anzahl; N++)
  {

    printf("\nWie lautet der Name des %d. Studierenden?\n", N+1);
    scanf("%s", Student->Name);
    printf("\nWelche Note hat er/sie geschrieben?\n");
    scanf("%f", Student->Note);
  }
}

void Ausgabe()
{
  struct Studenten *pointer;
  for(N=0; N<Anzahl; N++)
  {
    if(Student[N].Note < bestenote)
    {
      bestenote = Student->Note;
    }
  }

  for(N=0; N<Anzahl; N++)
  {
    if(Student[N].Note == bestenote)
    {
      printf("\n\n %s hat die beste Note %f geschrieben.\n", 
pointer->Name , pointer->Note);
    }
  }
}

int main()
{
  Einlesen();
  Ausgabe();
  return 0;
}

von jo (Gast)


Lesenswert?

Geh den Code doch mal schrittweise durch und guck dir an, was die 
Schleife beim einlesen macht und was beim ausgeben.

Nimm einfach ein Blatt Papier und N=2...

Beitrag #5945868 wurde von einem Moderator gelöscht.
von buffer_overflow (Gast)


Lesenswert?

Hallo,
ein paar Hinweise:
- Segmentation Fault deutet fast immer auf einen Buffer Overflow hin, 
sei from das du eine MMU hast

- ist ein Array die geeignete Datenstruktur für eine variable Anzahl an 
Studenten?
- wieviel Speicherplatz reserviert Dein malloc und für wieviele Einträge 
reicht der?
- was passiert wenn Name länger als 14?
- was passiert wenn N>0

von Dirk B. (dirkb2)


Lesenswert?

Bero408 schrieb:
> und am besten noch den Fehler
> erklären kann...

Du musst die Compileroption für Magic und Gedankenlesen aktivieren.

Dann weiß der Computer was du möchtest.

Sonst macht er nur, was du im sagst/schreibst.

von Bero408 (Gast)


Lesenswert?

Also, hab den Fehler jetzt korrigiert..
Jedoch funktioniert das Programm nun nur, wenn ich einen Studenten 
eingebe. Die Lösung wird sogar richtig ausgegeben.
Wenn ich jedoch mehrere studenten eingebe, kommt als Antwortsatz kein 
Name und die bestnote 0.0.....
Wieso funktioniert das mit einem Studenten aber nicht mit mehreren?

Neuer Code:

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

struct Studenten
{
  char Name[15];
  float Note;
};

int Anzahl, N;
float bestenote = 6.0;
struct Studenten *Student;
struct bestenote *NOTE;

void Einlesen()
{

  Student = (struct Studenten *) malloc(sizeof(struct Studenten));

  printf("Wieviele Studierende sind es?\n");
  scanf("%d", &Anzahl);
  for(N=0; N<Anzahl; N++)
  {

    printf("\nWie lautet der Name des %d. Studierenden?\n", N+1);
    scanf("%s", Student->Name);
    printf("\nWelche Note hat er/sie geschrieben?\n");
    scanf("%f", &Student->Note);
  }
}

void Ausgabe()
{
  struct Studenten *pointer;
  for(N=0; N<Anzahl; N++)
  {
    if(Student[N].Note < bestenote)
    {
      bestenote = Student[N].Note;
    }
  }

  for(N=0; N<Anzahl; N++)
  {
    if(Student[N].Note == bestenote)
    {
      printf("\n\n %s hat die beste Note %f geschrieben.\n", 
Student[N].Name , Student[N].Note);

    }
  }
}

void loescheTastaturpuffer()
{
  int c;
  while( ((c = getchar()) != EOF) && (c != '\n') )
     ;
}

int main()
{
  Einlesen();

  Ausgabe();
  return 0;
}

von jo (Gast)


Lesenswert?

Was an deinem Code lässt dich denn glauben, dass Du irgendwo 
Informationen über mehrere Studenten an einen unterschiedlichen Ort im 
Speicher legst? So dass Du diese Informationen später wieder abrufen 
kannst.

von Bero408 (Gast)


Lesenswert?

Sorry aber anstatt mich so provokant vorzuführen, könntest du dich 
nützlich machen und mir einfach einen Lösungsvorschlag machen, wenn du 
doch soo schlau bist.

von jo (Gast)


Lesenswert?

Das ist ganz offensichtlich eine Hausaufgabe. Du solltest dich also ein 
klein wenig damit beschäftigen. Und wenn Du mal schrittweise deine 
Schleife bei der Eingabe durchgehst
1
for(N=0; N<Anzahl; N++)
2
{
3
  printf("\nWie lautet der Name des %d. Studierenden?\n", N+1);
4
  scanf("%s", Student->Name);
5
  printf("\nWelche Note hat er/sie geschrieben?\n");
6
  scanf("%f", &Student->Note);
7
}

dann wirst Du sehen, dass Du in jedem Durchgang deinem einen Studenten 
einen Namen und eine Note zuweist.
Jetzt darfst Du wieder selber denken.

von cppbert3 (Gast)


Lesenswert?

Ich probier es mal: dein malloc ist falsch und dein Program hat 
undefiniertes Verhalten wenn du etwas machst was falsch ist - z.B. auf 
Speicher zugreifen den du gar nicht allokiert hast, und stürzt zu Glück 
schnell ab

von Bero408 (Gast)


Lesenswert?

Das war keine Hausaufgabe, sondern ist eine Klausurvorbereitung. :)
Jedenfalls habe ich den Fehler nun gefunden, danke jedenfalls.
Trotzdem kann man seine Hilfe netter formulieren und nicht so 
herablässig über Leute, die sich noch nicht so gut auskennen, lustig 
machen.
Danke trotzdem und schönen Abend noch.

von leo (Gast)


Lesenswert?

Bero408 schrieb:
> if(Student[N].Note < bestenote)

Du speicherst in der Eingabe alles unter der selben Adresse Student. In 
der Ausgabe verwendest du das als Array, welches nur an Index 0 
existiert.

leo

von jo (Gast)


Lesenswert?

Das hat nichts mit herablassend zu tun, aber gerade bei Anfängern ist 
das "Rubber Ducking" die Debug-Methode Nummer 1.
https://de.wikipedia.org/wiki/Quietscheentchen-Debugging

Deswegen der Hinweis, deinen Code Zeile für Zeile mit Stift und Papier 
durchzugehen. Dann wäre dir dein Fehler sofort aufgefallen.

von Oliver S. (oliverso)


Lesenswert?

jo schrieb:
> Das hat nichts mit herablassend zu tun, aber gerade bei Anfängern ist
> das "Rubber Ducking" die Debug-Methode Nummer 1.

Zitat:
1
 Beim Quietscheentchen-Debugging erklärt der Programmierer den Programmcode Zeile für Zeile ... zum Beispiel einer Person, die nichts vom Programmieren versteht

Den allermeisten Anfängern fehlt dafür der Programmierer, der ihnen das 
Programm Zeile für Zeile erklärt. Deshalb kommen die ja hier her.

Oliver

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.