mikrocontroller.net

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


Autor: Wenn der Zeiger in den Wald zeigt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdio.h>

int summe(int a, int b, int* summe)
{
  *summe = a+b;
  return ( (a+b)>=0 ? 1 : 0 ); 
}

int main()
{
  int a,b; 
  int* c;

  printf("1. Summand: ");
  scanf("%d", &a);
  printf("2. Summand: ");
  scanf("%d", &b);
  
  int retval = summe(a,b,c);
  if(retval == 1)
    printf("Summe ist groesser gleich Null: %d\n", *c);
  else
    printf("Summe ist kleiner als Null: %d\n", *c);
  return 0;
}

Berechnung der Lösung einer quadratischen Gleichung (dieses stürzt zur 
Laufzeit ab):
#include <math.h>
#include <stdio.h>

int quadGleichung(double a, double b, double c, double *x1, double *x2)
{
  double temp;
  int retval = -1;
  temp = pow(b,2) - (4 * a * c);
  printf("temp = %f\n", temp);
  if (temp >= 0.0)
  {
    retval = 0;
    *x1 = ( -b + (sqrt(temp)) ) / (2*a);
    *x2 = ( -b - (sqrt(temp)) ) / (2*a);
  }
  printf("Berechnung durchgefuehrt\n");
  return retval;
}

int main()
{
  double a1, b1, c1;
  double *x_1, *x_2;
  int r;

  printf("Geben Sie den Wert von a ein: ");scanf("%lf", &a1);
  printf("Geben Sie den Wert von b ein: ");scanf("%lf", &b1);
  printf("Geben Sie den Wert von c ein: ");scanf("%lf", &c1);

  r = quadGleichung(a1, b1, c1, x_1, x_2);
  if(r == -1)
    printf("Es gibt keine reelle Loesung.\n");
  else
    printf("x1 = %f, x2 = %f\n", *x_1, *x_2);

  return 0;
}


Wenn ich das letzte Programm ändere in den Zeilen:
  double x_1, x_2;
  r = quadGleichung(a1, b1, c1, &x_1, &x_2);
    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 :)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wenn der Zeiger in den Wald zeigt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und im ersten Beispiel funktioniert es trotzdem weil...? :)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
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 
...
int main()
{
  int a,b; 
  int c;

  int retval = summe( a, b, &c );

  ...

... in der sie ihr Ergebnis ablegen soll.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.