Dynamische Speicherverwaltung



  • Grüß euch!

    Ich hab Fragen zu einem Bsp-Programm mit malloc() und free():

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_STRLEN
    
    int get_lineno(FILE *infile);//ermittelt die Länge, also die Zeilen der .txt Datei
    
    void main()
    {
      char filename[MAX_STRLEN]="daten_in.txt";
      int file_len = 0;
      FILE *inFile=NULL;
      double *arrayValues=NULL;//für was die Variable da und warum setzt man die gleich NULL?
      double *actVal = NULL;//für was die Variable da und warum setzt man die gleich NULL?
      int n=0;
    
      inFile=fopen(filename,"rt");//liest aus .txt datei
      if (inFile != NULL) //Warum if(....)?
      {
        file_len=get_lineno(inFile);//unterprogrammaufruf, file_len=dateilänge
        rewind(inFile);
        arrayValues=malloc(sizeof(double)*file_len);//was macht das hier?
        if (arrayValues != NULL)//Warum if(....)?
        {
    
          actVal=arrayValues;//Warum soll actVal = arrayValeus sein?
          for(n=0; n<file_len; n++)
          {
            fscanf(inFile,"%lf",actVal);
            actVal++;//Was bewirkt dies genau?
          }
          actVal=arrayValues;//Warum soll actVal = arrayValeus sein?
          for(n=0; n<file_len; n++)
          {
            printf("%lf\n",*actVal);//Warum ist hier ein * und oben nicht?
            actVal++;
          }
          free(arrayValues);
        }
        else
        {
          printf("Memory allocation failure for Data of File %s !\n",filename);
        }
    		fclose(inFile);
      }
      else
      {
        printf("File %s could not be opened!\n",filename);
      }
    	//getchar();
    }
    
    int get_lineno(FILE *infile)
    {
      int len =0;
      double dummy;
    
      while (!feof(infile))
      {
        if (fscanf(infile,"%lf",&dummy) == 1)
        {
          len++;
        }
      }
      return (len);
    }
    

    In der .txt-Dateit steht:

    4
    3
    6
    8
    

    Bitte Kommentare lesen und sorry erstmal für die vielen Fragen, aber die Tutorials verstehe ich leider net ganz im Bezug auf das obere Beispiel

    Danke im voraus

    Gruß

    Anonymous


  • Mod

    double *arrayValues=NULL;//für was die Variable da und warum setzt man die gleich NULL?
      double *actVal = NULL;//für was die Variable da und warum setzt man die gleich NULL?
    

    Wozu sie da sind, siehst du später doch. Warum man sie auf NULL setzt: Unsinniger Cargo Cult von einem Programmierer, der Pointer nicht wirklich verstanden hat. Klares Warnzeichen, dass dieses Beispiel mit Vorsicht zu genießen ist.

    if (inFile != NULL) //Warum if(....)?
    

    Wie würdest du denn außer mit if eine Bedingung prüfen?

    arrayValues=malloc(sizeof(double)*file_len);//was macht das hier?
    

    arrayValues zeigt nun auf Speicher mit Platz für file_len Objekte von der Größe eines doubles. Oder auf NULL, falls der Speicher nicht besorgt werden konnte.

    if (arrayValues != NULL)//Warum if(....)?
    

    Siehe die zwei vorhergehenden Punkte.

    actVal=arrayValues;//Warum soll actVal = arrayValeus sein?
    

    Ja, nun, das ist eben das was das Programm tut.

    actVal++;//Was bewirkt dies genau?
    

    Es erhöht den Wert von actVal. Da actVal vom Typ double* ist, wird vereinfacht gesagt die Adresse die in actVal gespeichert ist, um die Größe eines doubles erhöht. actVal zeigt also nach der Erhöhung auf den nächsten Wert.

    actVal=arrayValues;//Warum soll actVal = arrayValeus sein?
    

    Siehe oben.

    printf("%lf\n",*actVal);//Warum ist hier ein * und oben nicht?
    

    Weil printf und scanf zwei sehr unterschiedliche Funktionen sind und ganz unterschiedlich benutzt werden. Beliebter Anfängerfehler, weil sie sich auf den ersten Blick ähneln.



  • Ok, danke.

    Naja wo sieht man bzw. woran merkt man das Speicher reseviert wird? Das verstehe ich noch net ganz.



  • Das ist nunmal das, was malloc macht.



  • Anonymous123 schrieb:

    Ok, danke.

    Naja wo sieht man bzw. woran merkt man das Speicher reseviert wird? Das verstehe ich noch net ganz.

    Das ist die Funktionalität der Funktion, die hier aufgerufen wird (malloc). Das merkst du nicht, sondern du weißt es, weil du die Funktion aufgerufen hast. Wenn du meinst, was du dann mit dem Speicher machen oder wie du auf ihn zugreifen kannst: malloc gibt einen Zeiger darauf zurück, mit dem du dann arbeiten kannst.

    http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/


Anmelden zum Antworten