Zwei Funktionen mit Zeigern - nur einmal funktioniert's richtig

Gast #1722563
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 :)
#1722601
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.

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