Hallo,
ich hab hier mal zwei Funktionen bzw. Programme geschrieben. Das eine
tut so wie es soll, das andere nicht, wobei ich meine dass ich
eigentlich auf die gleiche Art und Weise vorgegangen bin. Hier der Code:
Berechnung einer Summe
1
#include<stdio.h>
2
3
intsumme(inta,intb,int*summe)
4
{
5
*summe=a+b;
6
return((a+b)>=0?1:0);
7
}
8
9
intmain()
10
{
11
inta,b;
12
int*c;
13
14
printf("1. Summand: ");
15
scanf("%d",&a);
16
printf("2. Summand: ");
17
scanf("%d",&b);
18
19
intretval=summe(a,b,c);
20
if(retval==1)
21
printf("Summe ist groesser gleich Null: %d\n",*c);
22
else
23
printf("Summe ist kleiner als Null: %d\n",*c);
24
return0;
25
}
Berechnung der Lösung einer quadratischen Gleichung (dieses stürzt zur
Laufzeit ab):
printf("Geben Sie den Wert von a ein: ");scanf("%lf",&a1);
27
printf("Geben Sie den Wert von b ein: ");scanf("%lf",&b1);
28
printf("Geben Sie den Wert von c ein: ");scanf("%lf",&c1);
29
30
r=quadGleichung(a1,b1,c1,x_1,x_2);
31
if(r==-1)
32
printf("Es gibt keine reelle Loesung.\n");
33
else
34
printf("x1 = %f, x2 = %f\n",*x_1,*x_2);
35
36
return0;
37
}
Wenn ich das letzte Programm ändere in den Zeilen:
1
doublex_1,x_2;
2
r=quadGleichung(a1,b1,c1,&x_1,&x_2);
3
printf("x1 = %f, x2 = %f\n",x_1,x_2);
dann funzt es. Aber warum stürzt dann das erste Programm nicht auch ab?
Das versuche ich gerade zu verstehen und komm nicht vom Schlauch runter,
auf dem ich felsenfest drauf stehe :)
Wenn der Zeiger in den Wald zeigt schrieb:> Und im ersten Beispiel funktioniert es trotzdem weil...? :)
zufall. Man kann in C viele dinge tun die nicht zulässig sind. Aber
richtig ist es noch lange nicht wenn selbst wenn es geht.
Wenn der Zeiger in den Wald zeigt schrieb:> Und im ersten Beispiel funktioniert es trotzdem weil...? :)
... es nur so aussieht, als ob es funktionieren würde. In Wirklichkeit
tut es das nicht. Nur siehst du keine Symtome.
Man könnte auch sagen: Du hattest nur Pech, dass dir nicht sofort alles
um die Ohren geflogen ist.
Nicht jeder Pointer in einer Argumentliste
1
intsumme(inta,intb,int*summe)
bedeutet, dass der Aufrufer auch eine Pointer-Variable braucht. In
vielen Fällen (nämlich dann, wenn die Funktion den Pointer benutzt, um
dort ein Ergebnis abzulegen), bedeutet der Pointer in der Argumentliste
einfach nur, dass die Funktion die Adresse einer Variablen haben will
...
> Und im ersten Beispiel funktioniert es trotzdem weil...? :)
Du deinen Wert dort hinschreibst wo dein Pointer steht. Da der Pointer
selber aber weniger Bytes im Speicher beansprucht als eine Double geht
das frueher oder spaeter in die Hose.
Helmut Lenzen schrieb:>> Und im ersten Beispiel funktioniert es trotzdem weil...? :)>> Du deinen Wert dort hinschreibst wo dein Pointer steht.
Nö
Er hatte einfach nur das Pech, dass sein uninitialisierter Pointer in
irgendwelche Speicherbereiche zeigte, an denen nichts Vitales lag und
die er niederbügeln konnte, ohne das etwas Grausliches passiert.