#include <stdlib.h> // <cstdlib> en C++
void * realloc( void * pointer, size_t memorySize );
Cette fonction permet de réallouer un bloc de mémoire dans le tas (le heap en anglais). Cela veut dire que si l'espace mémoire libre qui suit le bloc à réallouer est suffisament grand, le bloc de mémoire est simplement agrandi. Par contre si l'espace libre n'est pas suffisant, un nouveau bloc de mémoire sera alloué, le contenu de la zone d'origine recopié dans la nouvelle zone et le bloc mémoire d'origine sera libéré automatiquement.
Si tout ce passe bien, la fonction vous renvoie un pointeur sur la zone de mémoire réallouée. Attention, ce pointeur est de type pointeur générique (void *) : si nécessaire, il est donc de votre responsabilité de "caster" votre pointeur vers un autre type (du moins si vous souhaitez ne pas avoir de warning affiché pas le compilateur, ce que je vous recommande vivement).
Dans le cas ou le bloc de mémoire ne pourrait vous être réalloué (plus de mémoire disponible, par exemple), le pointer NULL vous
sera retourné. On devrait normalement et systématiquement tester que la fonction ne renvoit pas cette valeur. Néanmoins cela n'est pas toujours
fait par les développeurs. Donc, un petit conseil, utilisez au moins un assert
.
#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int * ptr1 = (int *) malloc( sizeof(int) ); assert( ptr1 != NULL ); int * ptr2 = (int *) malloc( sizeof(int) ); assert( ptr2 != NULL ); (*ptr1) = 10; printf("ptr1=%p - ptr2=%p\n", ptr1, ptr2); ptr1 = (int *) realloc( ptr1, 10 * sizeof(int) ); assert( ptr1 != NULL ); printf( "ptr1=%p - ptr2=%p\n", ptr1, ptr2 ); printf( "(*ptr1) = %d\n", *ptr1); free( ptr1 ); free( ptr2 ); /* Un petit exemple d'exécution : ptr1=004302D0 - ptr2=004302A0 ptr1=00430260 - ptr2=004302A0 (*ptr1) = 10 Pour information, ptr2 a été alloué pour être certain que ptr1 ne pourra être réallouer sur place. */ return 0; }
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :