[C] Verzweifle an Pointern und Rückgabe

Minimilk

New member
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++;}
}
 

sTEk

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

Minimilk

New member
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
 

benediktibk

Standardgruppe für nicht aktivierte User
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
 

Minimilk

New member
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 :)
 

benediktibk

Standardgruppe für nicht aktivierte User
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
 

Minimilk

New member
130181167110.png
 
Oben