Segmentation fault

Gast #5945846
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;
}
Beitrag #5945868 wurde von einem Moderator gelöscht.
Gast #5945874
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
Gast #5945910
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;
}
Gast #5945914
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.
Gast #5945924
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.
Gast #5945927
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
Gast #5945930
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.
#5946792
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren