Forum: Compiler & IDEs Zwei Funktionen mit Zeigern - nur einmal funktioniert's richtig


von Wenn der Zeiger in den Wald zeigt (Gast)


Lesenswert?

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
int summe(int a, int b, int* summe)
4
{
5
  *summe = a+b;
6
  return ( (a+b)>=0 ? 1 : 0 ); 
7
}
8
9
int main()
10
{
11
  int a,b; 
12
  int* c;
13
14
  printf("1. Summand: ");
15
  scanf("%d", &a);
16
  printf("2. Summand: ");
17
  scanf("%d", &b);
18
  
19
  int retval = 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
  return 0;
25
}

Berechnung der Lösung einer quadratischen Gleichung (dieses stürzt zur 
Laufzeit ab):
1
#include <math.h>
2
#include <stdio.h>
3
4
int quadGleichung(double a, double b, double c, double *x1, double *x2)
5
{
6
  double temp;
7
  int retval = -1;
8
  temp = pow(b,2) - (4 * a * c);
9
  printf("temp = %f\n", temp);
10
  if (temp >= 0.0)
11
  {
12
    retval = 0;
13
    *x1 = ( -b + (sqrt(temp)) ) / (2*a);
14
    *x2 = ( -b - (sqrt(temp)) ) / (2*a);
15
  }
16
  printf("Berechnung durchgefuehrt\n");
17
  return retval;
18
}
19
20
int main()
21
{
22
  double a1, b1, c1;
23
  double *x_1, *x_2;
24
  int r;
25
26
  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
  return 0;
37
}

Wenn ich das letzte Programm ändere in den Zeilen:
1
  double x_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 :)

von Peter (Gast)


Lesenswert?

>  double *x_1, *x_2;
das sind erstmal nur zeiger, irgendwann muss du auch mal speicher für 
das double anfordern, oder halt auf die Zeiger verzichten.

von Wenn der Zeiger in den Wald zeigt (Gast)


Lesenswert?

Und im ersten Beispiel funktioniert es trotzdem weil...? :)

von Peter (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
int summe(int a, int b, 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 
...
1
int main()
2
{
3
  int a,b; 
4
  int c;
5
6
  int retval = summe( a, b, &c );
7
8
  ...

... in der sie ihr Ergebnis ablegen soll.

von Helmut L. (helmi1)


Lesenswert?

> 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.

von Karl H. (kbuchegg)


Lesenswert?

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.

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.