Speicher verkleinern



  • Guten Tag zusammen,

    diesmal soll es gerade anders herum gehen:
    Ein mit 2 MByte allokierter Speicherbereich s.u. soll zur Laufzeit verkleinert werden. Beispielweise auf 512 Byte. Geht das durch "realloc" ? Wenn ja, wie?

    compress1 = (unsigned char *)calloc(2048, sizeof(unsigned char));
    

    Vielen Dank,
    Euer Kevin



  • Ohne Gewähr:

    compress1 = (unsigned char *)realloc(compressl, sizeof(unsigned char) * 512);
    


  • 1. Man castet den Rückgabewert von calloc und realloc und malloc nicht! Das geschieht implizit! und der Cast kann potentielle Fehler verursachen

    2. sizeof(unsigned char) ist immer 1

    3. man weist den Rückgabewert von realloc nicht direkt dem Pointer zu, da man so eine Speicherlücke riskieren kann, wenn realloc fehlschlägt

    schaut auch man: realloc(3)



  • lovepulse schrieb:

    compress1 = (unsigned char *)calloc(2048, sizeof(unsigned char));
    

    so ist's besser 😉

    compress1 = calloc(2048, 1);
    

    und, klar, mit realloc kannste den speicher verkleinern...

    char *p = realloc (compress1, 512);
    


  • Vielen Dank!



  • lovepulse schrieb:

    wie muss ich die zwei Ausdrücke demnach hinschreiben?

    etwa so:

    char *compress1, *temp; 
    ...
    // originalgrösse...
    compress1 = malloc (2048);
    ...
    // grösse verändern
    temp = realloc (compress1, 512);
    if (temp)
    {  
      compress1 = temp;
      // ab hier gilt die grösse als verändert
      ...
    }
    else
    {
       // fehler behandeln
       ...
    }
    


  • warum benötige ich dazu einen extra Pointer? Kann ich auch das schreiben:

    compress1 = realloc (compress1, 512);
    

    Geht das?
    Vielen Dank!



  • lovepulse schrieb:

    warum benötige ich dazu einen extra Pointer? Kann ich auch das schreiben:

    compress1 = realloc (compress1, 512);
    

    ist keine gute idee...
    wenn realloc schief geht, löscht es dir den pointer und dann geht gar nix mehr 😉

    int safe_realloc (void **p, size_t size)
    {
       void *q = realloc (*p, size);
       if (q)
          *p = q;
       else
          return 0;   // fail
       return 1;      // ok
    }
    

Anmelden zum Antworten