2010-09-24 15 views
6

traf ich dieses kleine Stück Code in this question, & wissen wollte,Schrumpfen mit realloc

Kann die realloc() Funktion je einen Speicherblock an eine andere Stelle verschieben, wenn der Speicherplatz schrumpfte auf wird darauf?

int * a = malloc(10*sizeof(int)); 
int * b = realloc(a, 5*sizeof(int)); 

Wenn möglich, unter welchen Bedingungen kann ich b erwarten eine Adresse unterscheidet sich von dem in a haben?

Antwort

12

Es ist möglich, realloc Speicher bei jedem Anruf zu verschieben. True in vielen Implementierungen würde ein Verkleinern nur die reservierte Größe im Heap ändern und Speicher nicht verschieben. In einem Heap, der für eine geringe Fragmentierung optimiert wurde, kann der Speicher jedoch auch an einen besser geeigneten Speicherort verschoben werden.

Verlassen Sie sich nicht auf realloc halten Speicher an der gleichen Stelle für jede Operation.

+1

Nur um Zweifel zu beseitigen, habe ich tatsächlich diese Situation auf iOS 6, wo eine Realloc von 40K bis zu 224 Bytes bewegt tatsächlich den Speicher an einen neuen Ort. – sup