[C] Verzweifle an Pointern und Rückgabe

Hey, kann mir jemand einen Tipp geben warum mir der Pointer auf den allokierten Speicher nicht zurückgegeben wird? Habe gerade erst mit Pointern angefangen und blicke jetzt nicht mehr durch.

Das C-Programm liest den Grad einer Funktion ein und danach die Koeffizienten. Eigentlich müsste ich den Grad auch aus der Funktion zurückgeben, aber ich habs vorübergehend mit der Notlösung als globale Variable gelöst.

Code:
#include <stdio.h>
#include <stdlib.h>

void einlesen();
void ausgabe();
int n;
///////////////////////////////////////////////////// Hauptfunktion /////////////////////////////////////////////////

int main(){

double *ptr_feld;

einlesen(*ptr_feld);

printf("Grad: %i\n", n);

ausgabe(ptr_feld,n);

return 0;
}



//////////////////////////////////////////////// ausgelagerte Funktionen ////////////////////////////////////////////

void einlesen(double *ptr) {
    int i=0;
    double a=0;
    
    printf("Höchsten Grad eingeben: \n");
    scanf("%i", &n);
    if (n < 1){printf("Grad zu klein!\n");} //return 1 rausgenommen
    
    double* feld=(double*)malloc((n+1)*sizeof(double)); 
    if (!feld){printf("Zu wenig Speicher!\n");}// return 1 rausgenommen Liefert malloc NULL?
    
    printf("Koeffizienten eingeben, beginnend beim höchsten: \n");
    for (i=0; i <= n; i++) { scanf("%lf", &a); feld[i]=a;}
    ptr=&feld[0];
    
    
}

void ausgabe(double x[],int n) {
    int i=0;
    while(i<n){printf("%lf ",x[i]);i++;}
}
 
Du solltest im Feld 0 den Grad hinterlegen und dann die einzelnen Koeffizienten.

Damit steht in Deinem ptr_feld[0] also der Grad, und in ptr_feld[1]..ptr_feld[ptr_feld[0]] die einzelnen Koeffizienten.
 
Der Grad ist momentan nicht so wichtig. Das Problem ist, dass ich nicht an die Heap-Adresse in main komme.

Wenn ich die Funktion ausgabe() aufrufe liefert sie mir:
Code:
-5460592027904451241283838997223992844387417549932214856088547749173701112617760522041168308778088102100821985850275232761804259113654407045096019201553654069050281948427843264414485108585636921239786814325940214640626788802207783912172406454826650521163030334372410925965194684154038233911753972949975040.000000 -5025796531389545624161151669722114740307544281452336869214085674579346891260872413181596436900749404035133768054431146272677759092930482126893347616208938541963455571484044162294704577928092698379821263406544704563060916594269701570093742207674505945527986156425999016548139387604358735293719867270627328.000000
 
Ich sollte endlich mal aufhören die Hausaufgaben fremder Leute zu machen :p

Code:
#include <stdio.h>
#include <stdlib.h>

int einlesen(double *ptr[], int *n);
void ausgabe(double x[], int n);
///////////////////////////////////////////////////// Hauptfunktion /////////////////////////////////////////////////

int main()
{
  double *ptr_feld = 0;
  int n = 0;

  if (0 != einlesen(&ptr_feld, &n))
    return 1;

  printf("Grad: %i\n", n);

  ausgabe(ptr_feld,n);

  free(ptr_feld);
  ptr_feld = 0;

  return 0;
}



//////////////////////////////////////////////// ausgelagerte Funktionen ////////////////////////////////////////////

int einlesen(double *ptr[], int *n) 
{        
    printf("Höchsten Grad eingeben: \n");
    scanf("%i", n);
    
    if (*n < 1)
    {
      printf("Grad zu klein!\n");
      return 1;
    }
    
    *ptr = (double*)malloc((*n+1)*sizeof(double)); 
    if (0 == *ptr)
    {
      printf("Zu wenig Speicher!\n");
      return 1;
    }
    
    printf("Koeffizienten eingeben, beginnend beim höchsten: \n");
    for (int i=0; i <= *n; i++) 
      scanf("%lf", (*ptr) + i);
    
    return 0;
}

void ausgabe(double x[],int n) 
{    
    for (int i = 0; i <= n; ++i)
	printf("%lf ",x[i]);
}

mfg benediktibk
 
Danke! Ganz schön verwirrend mit den Pointern und auch warum bei scanf("%i", n); das & vor dem n wegfällt verstehe ich auch noch nicht ganz, aber so langsam funktioniert es :)
 
Das & fällt weg, weil scanf eine Adresse benötigt. Wenn du eine Variable mit "int *x" definierst, so erhältst du immer die Adresse wenn du "x" verwendest, solange du nicht einen Stern davorschreibst.

mfg benediktibk
 
130181167110.png
 
Zurück
Oben