Memory alloc in Unterfunktion



  • Hallo,

    mein Hirn hat schon einen Pointer-Knoten und deswegen frage ich mal euch 🙂

    Ich möchte in einer Funktion Speicher allokieren, den Speicherbereich füllen und danach zurückgeben. Wieviel Speicher allokiert wird, wird in der Funktion entschieden.

    Ich dachte mir, ich übergebe einen **-Pointer an die Funktion um damit den Pointer auf den Speicherbereich zurückzugeben, als Rückgabe übergebe ich die Größe des allokierten Speichers.

    Was ich im Moment nicht verstehe ist, bei mir kommt immer Müll raus wenn ich direkt zum übergebenen Pointer den malloc mache. Erstelle ich einen Interims-Pointer und kopiere den dann in den übergebenen Pointer, dann geht es. Wo ist mein Denkfehler?

    Hier der Code.

    Funktioniert:

    void main()
    {
     uint8_t * response;
    
     int numbytes = getData(&response);
    
     // Ergebnis ausgeben zum prüfen
     for (int i=0;i<numbytes;i++)
     {
        printf("%02x",response[i]);
     }
    }
    
    int getData(uint8_t ** ptr)
    {
      // Erstmal einen Interimspointer
      uint8_t * mem = (uint8_t *)calloc(anotherfunction.getLength(),sizeof(uint8_t);
    
      for (int i=0;i<anotherfunction.getLength(),i++)
      {
         mem[i] = anotherfunction.getValue[i];
      }
      // Pointer kopieren
      *ptr = mem;
      return another function.getLength();
    }
    

    (Zwischenfrage: sollte eigentlich free(response) am Ende von main funktionieren? Ich mein, weil das ja nicht der "Originalpointer" ist mit dem ich malloc benutzt habe.)

    Funktioniert NICHT:

    void main()
    {
     uint8_t * response;
    
     int numbytes = getData(&response);
    
     // Ergebnis ausgeben zum prüfen
     for (int i=0;i<numbytes;i++)
     {
        // Hier kommt Müll raus, ist nicht das was in getData eigentlich geschrieben wurde..
        printf("%02x",response[i]);
     }
    }
    
    int getData(uint8_t ** ptr)
    {
      *ptr = (uint8_t *)calloc(anotherfunction.getLength(),sizeof(uint8_t);
      for (int i=0;i<anotherfunction.getLength(),i++)
      {
         *ptr[i] = anotherfunction.getValue[i];
      }
    
      return another function.getLength();
    }
    


  • Lace schrieb:

    *ptr[i] = anotherfunction.getValue[i];
    

    Du hast die Operatorenrangfolge nicht beachtet. Das muss

    (*ptr)[i] = anotherfunction.getValue[i];
    

    heißen.



  • Hast Du mal einen Link zu einem Tutorial wo das näher beleuchtet wird? Im C-FAQ hatte ich nichts gefunden. Mir war auch nicht bewusst das ich ein Problem in dieser Richtung hatte.... 🤡

    P.S.: Danke 🙂




Anmelden zum Antworten