Forum: Compiler & IDEs .exe Datei stürtzt beim Aufruf ab


von Programmierer (Gast)


Lesenswert?

Hallo Leute,
Ich habe ein Programm geschrieben, aber diese stürzt komischerweise beim 
aufrufen ab. Ich habe es heute in der Schule probiert, und dort hat es 
zuerst nicht funktioniert, dann habe ich einen neuen Ordner auf meinem 
Stick erstellt und es dort aufgerufen und dann ging es.

Jetzt zuhause geht es wieder nicht. Ich benutze Codeblocks.

Kurz zum Programm, es sollen mehrere Obejktnummern eingelesen werden und 
diese dann ausgegeben werden bzw ein gewünschtes gelöscht werden können.

Hier der Code:
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
struct haeuser
5
{
6
  int objektnummer;
7
   char strasse[20];
8
   int hausnummer;
9
   char haustyp;
10
   float wohnflaeche;
11
   int baujahr;
12
   float preis;
13
   struct haeuser *zg;
14
};
15
16
17
void hausanhaengen(struct haeuser *head, int Objekt);
18
void hausloeschen(struct haeuser *head, int objektnr);
19
void Ausgabe(struct haeuser *head);
20
21
void main()
22
{
23
24
   struct haeuser *head;
25
   head=(struct haeuser*)malloc(sizeof(struct haeuser));
26
   int Objekt=0,objektnr=0;
27
28
29
   char buchstabe;
30
   int flag=1;
31
32
33
      while(flag==1)
34
      {
35
      printf("Bitte geben Sie einen Buchstaben ein:\n");
36
        fflush(stdin);
37
       scanf("%c",&buchstabe);
38
39
       switch(buchstabe)
40
       {
41
42
            case'e':
43
44
              hausanhaengen(head,Objekt++);
45
               break;
46
47
            case'l':
48
              printf("Bitte geben Sie die zu loeschende Objektnummer ein:\n");
49
               scanf("%i",&objektnr);
50
              hausloeschen(head,objektnr);
51
          break;
52
53
            case'a':
54
              Ausgabe(head);
55
              break;
56
57
            case 'b':
58
             flag=0;
59
              break;
60
       }
61
     }
62
63
}
64
65
66
void hausanhaengen(struct haeuser *head,int Obj)
67
{
68
  struct haeuser *n;
69
   while((*head).zg!=NULL)
70
   head=(*head).zg;
71
   n=(struct haeuser*)malloc(sizeof(struct haeuser));
72
73
   if(n!=NULL)
74
   {
75
     (*n).zg=NULL;
76
      (*n).objektnummer=Obj;
77
      (*head).zg=n;
78
   }
79
   else
80
   printf("Fehler bei der Speicherreservierung\n");
81
}
82
83
void hausloeschen(struct haeuser *head,int objektnr)
84
{
85
  struct haeuser *suchhaus,*suchhausz;
86
   suchhaus=head;
87
   suchhausz=(*suchhaus).zg;
88
   while((*suchhausz).objektnummer!=objektnr)
89
   {
90
     suchhaus=suchhausz;
91
      suchhausz=(*suchhaus).zg;
92
   }
93
   (*suchhaus).zg=(*suchhausz).zg;
94
  free(suchhausz);  //Speicher freigeben
95
}
96
97
void Ausgabe(struct haeuser *head)
98
{
99
  while((*head).zg!=NULL)
100
  {
101
      head=(*head).zg;
102
      printf("Nummer: %i\n",(*head).objektnummer);
103
  }
104
  printf("\n");
105
106
}
Danke für die Hilfe!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Im Debugger laufenlassen. Dann kannst Du selbst herausfinden, was 
schiefläuft.
Ja: Genau dafür ist der Debugger da, nutze ihn!

von Karl H. (kbuchegg)


Lesenswert?

1
void hausanhaengen(struct haeuser *head,int Obj)
2
{
3
  struct haeuser *n;
4
   while((*head).zg!=NULL)
5
6
...

wo kommt head her?
Von hier
1
   head=(struct haeuser*)malloc(sizeof(struct haeuser));
2
3
...
4
              hausanhaengen(head,Objekt++);

tja.
Aber nur weil du mittels malloc Speicher allokiert hast, bedeutet das 
nicht, dass da nur 0-en (und damit ein NULL Pointer) drinnen steht.

schreib dir eine Funktion, die ein neues Haus allokiert und dabei den 
Inhalt des neuen Hauses in einen vernünftigen Zustand bringt.
Und die Funktion verwendest du dann, wenn du ein neues Haus brauchst.

von Karl H. (kbuchegg)


Lesenswert?

Ich weiß nicht, ob ihr das schon gelernt habt.

Aber das hier (beispielsweise), ist eine sehr mühsame Schreibweise
1
      (*head).zg=n;
Klammer auf, den Stern und wieder Klammer zu. Sie ist allerdings zu 100% 
richtig. Da kann man nicht meckern.

Und da das ziemlich mühsam zu tippen ist und dabei auch leicht Fehler 
entstehen, gibt es in C eine alternative Schreibweise.
1
   (*a).b
2
3
ist exakt völlig identisch zu
4
5
   a->b

Du kannst also anstelle von
1
      (*head).zg=n;
auch
1
      head->zg = n;
schreiben. Das ist exakt identisch dazu.
Letzteres ist die übliche Schreibweise. Der '->' (Pfeil) symbolisiert 
dabei das Dereferenzieren eines Pointers in einen Strukturmember.

von Programmierer (Gast)


Lesenswert?

Die Schreibweise kennen wir nicht und das Programm ist ja richtig, einer 
aus meiner Klasse hat es auch getestet und es ging bei ihm von daher...

Und wie gesagt nachdem ich das Programm direkt auf den Stick kopiert 
habe ging es in der Schule ja auch.

Übrigens kommt das abstürzen nur wenn ich "e" drücken will bei b wird es 
beendet und bei l steht da dann "waehle zu loeschenden Objektnr aus:" 
natürlich crasht es dann wenn ich was eingebe.

von Karl H. (kbuchegg)


Lesenswert?

Programmierer schrieb:
> Die Schreibweise kennen wir nicht

ok, dann will ich deinem Lehrer auch nicht vorgreifen.

> und das Programm ist ja richtig,

Nein, ist es nicht.
Das ist schwer fehlerhaft.

> einer
> aus meiner Klasse hat es auch getestet und es ging bei ihm von daher...

Durch testen kann man nur die Anwesenheit von Fehlern feststellen, nie 
die Abwesenheit. Wenn ein Programm fehlerhaft ist, heisst das noch lange 
nicht, dass es sofort und immer abstürzt. Je nachdem, in welchem Zustand 
der Speicher ist, denn das Betriebssystem auf die Anforderung hin 
rausrückt, können da 0-en drinnen stehen. Können - müssen aber nicht.

Es gibt keine Garantie dafür, welche Werte im Speicher stehen, der von 
malloc allokiert wird. Entweder du bringst dieses neue Objekt selbst in 
einen defnierten Zustand oder du benutzt calloc. Das nullt den Speicher 
aus, was dich zumindest in diesem Fall retten würde.

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.