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 mehrint safe_realloc (void **p, size_t size) { void *q = realloc (*p, size); if (q) *p = q; else return 0; // fail return 1; // ok }