2010-09-24 6 views
6

ho incontrato questo piccolo pezzo di codice in this question, & voleva sapere,Shrinking con realloc

Può la funzione realloc() mai spostare un blocco di memoria in un'altra posizione, quando lo spazio di memoria puntato è rimpiccioliti?

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

Se possibile, a quali condizioni, posso aspettare b avere un indirizzo diverso da quello in a?

risposta

12

E 'possibile per realloc spostare la memoria su qualsiasi chiamata. Vero in molte implementazioni una riduzione si tradurrebbe solo nel cambiamento della dimensione riservata nell'heap e non sposterebbe la memoria. Tuttavia, in un heap ottimizzato per una bassa frammentazione, può scegliere di spostare la memoria in una posizione migliore.

Non dipendere da realloc mantenendo la memoria nello stesso posto per qualsiasi operazione.

+1

Solo per rimuovere qualsiasi dubbio, ho effettivamente riscontrato questa situazione su iOS 6 dove un realloc di 40K fino a 224 byte sposta effettivamente la memoria in una nuova posizione. – sup