malloc richtig nutzen??



  • Ich muss nämlich den Speicherplatz für eine Variable sichern die sich hinter 2 Zeigern versteckt!

    Ich bekomme in eine Funktion einen char **String;
    In dieser Funktion wird die groesse des zu Speichernden Textes berechnet!
    Nun muss ich ja den Speicherplatz für String bereitstellen!!!

    Nur das bekomme ich nicht hin!

    1. Ich weiß nicht wirklich wie ich Speicherplatz für einen char reserviere!
    ->> .... = malloc(Zeichen im Text * 😎 ????
    oder
    ->> .... = malloc(Zeichen)??????

    2. Problem. Ich weiß nicht wie genau ich den Speicherplatz für eine Variable reserviere die sich hinter Zeigern versteckt!

    ->>**String = malloc(...);
    oder
    ->>String = malloc(...);

    Ich habe da schon einiges ausprobiert aber ich bekomme im Speicherzugriffsverletzungen!
    Da String == NULL ist!

    WAS MACH ICH FALSCH??



  • void f (char **string)
    {
       char *speicher = malloc (strlen(*string)+1);  // so viel speicher wie der string lang ist + 1 byte für die 0
       ...
    }
    

    🙂



  • Da bekomm ich aber folgende Fehlermeldung!

    Und wieso überhaupt *Speicher = .....??
    Müsste da nicht auch *String stehen!

    "Unbehandelte Ausnahme bei 0x00415807 in Dateien.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000."



  • zeig mal den ganzen code bzw. wie du's machst. ich wette das passt nicht ganz zu deiner beschreibung.
    🙂



  • void ZeileAuslesen (FILE * datei,char **String)
    {
      int length=0;
      if (String == Null){
         /**Zeilenlänge Berechnen*/
         while (getc(datei)!= '\n'){
    	  length++;
         }
    
      *String = malloc (strlen(*String +1));
      fgets(datei,length,String) // Das klappt auch net ??
      }
    }
    


  • void ZeileAuslesen (FILE *datei, char **string)
    {
       char b[512]; // <-- wenn's passt?
       fgets (b, sizeof(b), datei);
       *string = malloc (strlen(b)+1);
       if (*string)
          strcpy (*string, b);
    }
    ...
    FILE *fp = fopen (...);
    char *string;
    ZeileAuslesen (fp, &string);
    ...
    

    🙂



  • Wie kommst du auf 512???????
    Willst du damit die maximalen Zeichen in einer Zeile bestimmen, oder was??

    *String = malloc (strlen(b)+1);
    

    Gibt bei mir immer noch den selben Fehler!!
    Ich weiß einfach nicht warum!



  • Thes-One schrieb:

    Wie kommst du auf 512???????
    Willst du damit die maximalen Zeichen in einer Zeile bestimmen, oder was??

    richtig. du kannst den wert natürlich vergrössern wenn du willst, 2048 oder sowas. wenn du auf'ner PC-kiste programnierst, sollte genügend stack space vorhanden sein.
    🙂



  • *String = malloc (strlen(b)+1);
    

    Gibt bei mir immer noch den selben Fehler!!
    Ich weiß einfach nicht warum!

    Zu den 512:
    Gibt es den einen Wert der maximal in eine Zeile eingelesen werden kann??
    Ich denke mal nicht das eine Zeile unendlich lang sein kann!

    Warscheinlich OS oder System abhängig, oder???



  • Ich denke mal das das Problem ganz klar daran liegt das man einen Wert String zuweisen möchte doch String hat ja keinen Speicherplatz wenn die Adresse
    0x00000000 ist oder????

    Ich habe String vorher (andere Funktion mit NULL Deklariert)!!

    ???????????????? 😮 😮 😮



  • probier' dies:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int ZeileAuslesen (FILE *datei, char **string)
    {
       char b[512]; 
       if (0 == fgets (b, sizeof(b), datei))
          return 0;
       *string = malloc (strlen(b)+1);
       if (*string)
          strcpy (*string, b);
       return 1;
    }
    
    int main ()
    {
       FILE *fp = fopen ("name_deiner_datei", "r");
       if (fp)
       {
          char *string;
          while (ZeileAuslesen (fp, &string))
          {
            printf (string);
            free (string);
          }
       }
    }
    

    ...und übrigens: etwas mehr eigeninitiative bitte! es fällt mir auf, dass man dir alles vorkauen muss (nicht so böse gemeint, wie es klingt). spiel mehr rum mit C. schau dir z.b. meinen code an und finde die macken. wenn man dir alles vorbeten muss, dann lernst du nix und verlierst auch bald den spass daran, weil dir die erfolgserlebnisse (dieses: das hab ich selbst geschafft!) fehlen.
    🙂



  • thx!!
    Jetzt geht es! 👍 👍 👍 👍



  • Hi!

    Thema Dynamisches Array mit malloc!

    Ich habe ein Problem, also einen Fehler in meinem Programm.
    Ich habe eine Funktion in der ich die Zeilen einer Datei zähle und jenachdem wieviele Zeilen die Datei hat alloziere ich speicherplatz für eine Variable!
    Diese Variable ist ein Dynamisches Array.Im Prinzip pro Zeile einen Index!

    Das Array wird auch richtig gefüllt aber sobald ich mit der Arbeit in der Funktion fertig bin und in die Main zurück springe beeinhaltet das Array nur noch den Wert vom ersten hinzufügen!

    int
    main (int argc, char * argv[])
    { 
      CD   * Playlist=NULL;
      File * Datei = fopen (argv[1], "r");
    
      laden(&Playlist,Datei);
    
    }
    
    void laden (CD * PL, FILE * file){
    
    /*Zeilen zählen*/
    
    /*Speicherplatz allozieren fuer PL*/
    
    /*PL fuellen*/
    PL->Tracks[0] = ...
    PL->Tracks[1] = ...
    
    /*Fertig*/
    
    }
    

    Die laden Funktion funktioniert einwandtfrei!
    Also die Werte werde alle richtig abgespeichert!
    Nur wenn ich dann in der Main mir die Werte anschaue, ist nur noch der erste drin!
    Also der erste Wert der eingefügt wurde!

    Kann man so schon einen Fehler erkennen, oder muss man etwas bestimmtes beachten bei der übergabe von Dynamischen Arrays an andere Funktionen???


Anmelden zum Antworten