2016-08-12 4 views
2

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); 
} 
  1. In diesem Codebeispiel kann ich sicher sein, dass ein kleiner realloc die höchste Zahl fallen wird?

  2. Gibt der realloc nur den letzten Speicher frei und behält die gleiche Adresse in str? Oder kann sich die Adresse ändern, obwohl sie kleiner wird und sicher Platz an der aktuellen Stelle hat?

+1

'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

+0

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. –

Antwort

4
  1. Ja. Wenn Sie einen Speicherblock der Größe N haben und Sie realloc(p, M) tun, dann wird (unter der Annahme, dass realloc erfolgreich ist) das Ergebnis die ersten min(N, M) Bytes von p enthalten.

  2. Die Adresse kann sich ändern, auch wenn die neue Größe kleiner als die alte ist. realloc gibt einfach keine Garantien über diesen Fall (es kann sogar fehlschlagen).

+1

Auch 'realloc()' kann 'NULL' zurückgeben, sogar für eine Anforderung zum Verkleinern. –