Ich habe ein paar Fragen zum Verständnis realloc
Verhalten.Abnehmende Realloc
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *str;
/* Initial memory allocation */
str = malloc(5 * sizeof(int));
*str = 1;
*(str + 1) = 2;
*(str + 2) = 3;
*(str + 3) = 4;
*(str + 4) = 5;
/* Reallocating memory */
int i, j;
for (i = 5; i > 0; i--) {
str = realloc(str, i * sizeof(int));
for (j = 0; j < i; j++) {
printf("%d", *(str + j));
}
printf("\n");
}
free(str);
return(0);
}
In diesem Codebeispiel kann ich sicher sein, dass ein kleiner
realloc
die höchste Zahl fallen wird?Gibt der
realloc
nur den letzten Speicher frei und behält die gleiche Adresse instr
? Oder kann sich die Adresse ändern, obwohl sie kleiner wird und sicher Platz an der aktuellen Stelle hat?
'realloc()' darf immer in einen neuen Adressraum verschoben werden. Zum Beispiel könnte es unterschiedliche Speicherbereiche für Blöcke unterschiedlicher Größe verwenden. – Barmar
C99 und C11 sind ziemlich klar über 'realloc()': _Die 'realloc'-Funktion hebt das alte Objekt auf, auf das ptr zeigt, und gibt einen Zeiger auf ein neues Objekt mit der durch' size' angegebenen Größe zurück In einigen Implementierungen hat das neue Objekt die gleiche Adresse wie das alte Objekt, aber das alte Objekt wurde technisch freigegeben. Sie können auf keinen der zuvor zugewiesenen Speicher legitim zugreifen - dies führt zu undefiniertem Verhalten. Sie haben also keine Möglichkeit zu testen, was passiert. Die meisten Implementierungen werden die Daten beim Verkleinern des Speichers nicht verschieben, aber es gibt keine Garantie. –