Segmentation fault

Gast #5945846
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;
}
Gast
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.
Gast
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
Gast
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;
}
Gast
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.
Gast
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.
Gast
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.
Gast
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
Gast
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.
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.